假设 有这样 一个需求, 我获取了一组日期是某个人的通话日期,
我想计算出 这段时间里面, 没有通话的天数, 以及 连续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
过滤后掉 1day 的 差值的 series diff_days
结果如下:
无通话记录的次数:7
无通话记录的天数:70
连续3(包括3天)天以上没有通话的记录的次数:4
本文主要讲了如何将 时间字符串转成pandas 中 可以相减的方式. 方法是先转成 datetime 之后 转成 series ,在series 里面 可以方便的实现 日期相减,去重,排序等操作.