pandas 中处理日期相减问题

pandas 中处理日期相减问题.

假设 有这样 一个需求, 我获取了一组日期是某个人的通话日期,
我想计算出 这段时间里面, 没有通话的天数, 以及 连续3天以上没有通话的次数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time    : 2019/5/1 08:02
@File    : test_diff.py
@Author  : [email protected]


pandas 里面 如何 对日期进行相减 .


假设 有这样 一个需求, 我获取了一组日期是某个人的通话日期,
我想计算出 这段时间里面, 没有通话的天数,  以及 连续3天以上没有通话的次数

如何计算呢?

举个例子:

假设 我要计算 从5.2号 到 5.11 这段时间里,没有通话的天数

['2018-05-02', '2018-05-05', '2018-05-11']



可以看出 这些天 没有通话的天数,  无通话天数 就是 6 天
nocall_date = [5.3, 5.4 ,5.6 ,5.7,  5.8, 5.9,5.10 ]


连续3(包括3天)天以上没有通话的次数:


5.6 ,5.7,  5.8, 5.9,5.10   这是 1 次

5.3, 5.4    这是  0 次

总的 就是 1 次



solution:   首先 把这些 日期转成pandas.Series   之后 排序,去重之后, 然后diff
无通话记录的就是 差值 大于1 天的记录.

连续3(包括3天)天以上没有通话的记录 就是 差值 大于4天 的记录.



"""

from datetime import timedelta

import pandas as pd

from datetime import datetime

if __name__ == '__main__':
    call_dates = [
        '2018-05-02', '2018-05-03', '2018-07-21', '2018-07-15', '2018-05-07',
        '2018-05-07', '2018-07-20', '2018-07-17', '2018-07-19', '2018-07-19',
        '2018-07-13', '2018-06-14', '2018-05-19'
    ]

    # 转成 datetime 类型
    mydate = [datetime.strptime(item, '%Y-%m-%d') for item in call_dates]

    # 转成 series 
    s = pd.Series(mydate)

    # 去除重复数据
    s.drop_duplicates(inplace=True)

    # 排序
    s.sort_values(inplace=True)

    # 重新调整一下index 下标
    s.reset_index(drop=True, inplace=True)

    # 求差值
    diff_value = s.diff()

    one_day = timedelta(days=1)
    three_day = timedelta(days=3)

    # 计算无通话记录的次数
    diff_days = diff_value.loc[lambda x: x > one_day]

    # 重置 index
    diff_days.reset_index(drop=True, inplace=True)
    print(f"无通话记录的次数:{diff_days.size}")

    nocall_days = sum([delta.days for delta in diff_days]) - diff_days.size
    print(f"无通话记录的天数:{nocall_days}")

    # 计算 连续3(包括3天)天以上没有通话的记录
    three_days_nocall = diff_value.loc[lambda x: x > three_day]
    print(f"连续3(包括3天)天以上没有通话的记录的次数:{three_days_nocall.size}")


去重 排序后的series

pandas 中处理日期相减问题_第1张图片
pandas 中处理日期相减问题_第2张图片

diff_value
pandas 中处理日期相减问题_第3张图片
pandas 中处理日期相减问题_第4张图片

过滤后掉 1day 的 差值的 series diff_days
pandas 中处理日期相减问题_第5张图片
pandas 中处理日期相减问题_第6张图片

结果如下:

无通话记录的次数:7
无通话记录的天数:70
连续3(包括3天)天以上没有通话的记录的次数:4
总结

本文主要讲了如何将 时间字符串转成pandas 中 可以相减的方式. 方法是先转成 datetime 之后 转成 series ,在series 里面 可以方便的实现 日期相减,去重,排序等操作.

分享快乐,留住感动. 2019-05-01 09:35:08 --frank

你可能感兴趣的:(python基础&进阶)