Python-Pandas之两个日期数据求差(天数差、秒数差等)

在数据帧里面,经常碰到要计算两个时间格式列的天数差,比如用户的活跃天数,我们肯定是用最近登录日期减去用户的下载日期,但是要怎么做呢?

其实很简单,pandas的dataframe是可以直接用列相减的,当然是时间类型和数值类型的才行。数值类型加减乘除不用多说了,基本和数值的加减乘除是一样的。无非就是要对除的列要做一下 replace(np.inf, 0) 处理,这个是防止出现除零的情况,一般是用0替换掉就可以了。

那时间格式的怎么办?

其实时间格式直接相减,会得到一个 np.timedelta64 类型的数据,如:

df['diff_date'] = df['datetime'] - df['last_datetime']
df['diff_date']


"""
得到的结果:
0         0 days 00:10:28.018523
1         0 days 00:03:32.858611
2         0 days 01:03:23.596080
3         0 days 00:02:13.528628
4         0 days 00:04:21.056487
                  ...           
49061     0 days 00:01:20.101328
49062     0 days 00:35:56.992573
49063     0 days 00:00:24.712446
49064     0 days 00:04:17.424946
49065     0 days 00:01:53.180180
Name: diff_date, Length: 49066, dtype: timedelta64[ns]
"""

那这个我们要怎么化成我们需要的值,比如我们要知道两个时间的秒数差,看看每个用户的间隔时间是多久,可以这么做:

# # 计算两个日期的差值
row_index = 45000  # 还是取这一行的数据显示,不要显示全部的了
print('日期1:', df['datetime'].values[row_index], ',日期2:', df['last_datetime'].values[row_index])

df['diff_date_second'] = ((df['datetime'] - df['last_datetime'])/pd.Timedelta(1, 'S')).fillna(0).astype(int)
print('两个日期相差的秒数:', df['diff_date_second'].values[row_index])



"""
这个打印的结果如下:
日期1: 2020-03-24T21:03:42.659895000 ,日期2: 2020-03-24T05:23:54.462034000
两个日期相差的秒数: 56388
"""

我们看到,我把相减的值又除了一个Timedelta,并且按秒去计算,这样我们得到的结果就是秒数了。在后面还跟了一个fillna(0),意思是万一有空值,就用0填充,即使我们知道没有空值,但我推荐还是这么做一下会好一些。而最后的astype(int),我需要把这一列当做整数型去做,免得有小数点,这样我们的数据看起来会整洁很多!

那么这个方式的最核心的就是 pd.Timedelta(1, 'S') 了,看到这里我想大家都知道怎么求天数差,小时差,分钟差了吧!原理都一样的,我这里都列举出来吧:

# # 计算两个日期的差值
row_index = 45000
print('日期1:', df['datetime'].values[row_index], ',日期2:', df['last_datetime'].values[row_index])

df['diff_date_second'] = ((df['datetime'] - df['last_datetime'])/pd.Timedelta(1, 'S')).fillna(0).astype(int)
print('两个日期相差的秒数:', df['diff_date_second'].values[row_index])

df['diff_date_minute'] = ((df['datetime'] - df['last_datetime'])/pd.Timedelta(1, 'min')).fillna(0).astype(int)
print('两个日期相差的分钟数:', df['diff_date_minute'].values[row_index])

df['diff_date_hour'] = ((df['datetime'] - df['last_datetime'])/pd.Timedelta(1, 'H')).fillna(0).astype(int)
print('两个日期相差的小时数:', df['diff_date_hour'].values[row_index])

df['diff_date_day'] = ((df['datetime'] - df['last_datetime'])/pd.Timedelta(1, 'D')).fillna(0).astype(int)
print('两个日期相差的天数:', df['diff_date_day'].values[row_index])





"""
打印的结果:
日期1: 2020-03-24T21:03:42.659895000 ,日期2: 2020-03-24T05:23:54.462034000
两个日期相差的秒数: 56388
两个日期相差的分钟数: 939
两个日期相差的小时数: 15
两个日期相差的天数: 0
"""

大家可以自己算算看结果对不对~

  • 10
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏小败在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值