Pandas DataFrame计算特定时间范围内两列之间的时差

时间:2018-11-12 07:43:08

标签: python pandas datetime

我想计算特定时间范围内两列之间的时差。

我尝试df.between_time,但它仅适用于索引。

例如时间范围:18.00-8.00

数据:

             start               stop
0   2018-07-16 16:00:00  2018-07-16 20:00:00
1   2018-07-11 08:03:00  2018-07-11 12:03:00
2   2018-07-13 17:54:00  2018-07-13 21:54:00
3   2018-07-14 13:09:00  2018-07-14 17:09:00
4   2018-07-20 00:21:00  2018-07-20 04:21:00
5   2018-07-20 17:00:00  2018-07-21 09:00:00

预期结果:

          start                  stop           time_diff
0   2018-07-16 16:00:00  2018-07-16 20:00:00    02:00:00
1   2018-07-11 08:03:00  2018-07-11 12:03:00    0
2   2018-07-13 17:54:00  2018-07-13 21:54:00    03:54:00
3   2018-07-14 13:09:00  2018-07-14 17:09:00    0
4   2018-07-20 00:21:00  2018-07-20 04:21:00    04:00:00
5   2018-07-20 17:00:00  2018-07-21 09:00:00    14:00:00

注意:如果time_diff> 1天,我已经处理了该案。

问题:我应该构建一个函数来执行此操作,还是应该有pandas内置函数来执行此操作?任何帮助或指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为这可以解决

tmp = pd.DataFrame({'time1': pd.to_datetime(['2018-07-16 16:00:00', '2018-07-11 08:03:00', 
                                             '2018-07-13 17:54:00', '2018-07-14 13:09:00', 
                                             '2018-07-20 00:21:00', '2018-07-20 17:00:00']),
                    'time2': pd.to_datetime(['2018-07-16 20:00:00', '2018-07-11 12:03:00', 
                                             '2018-07-13 21:54:00', '2018-07-14 17:09:00', 
                                             '2018-07-20 04:21:00', '2018-07-21 09:00:00'])})
time1_date = tmp.time1.dt.date.astype(str)
tmp['rule18'], tmp['rule08'] = pd.to_datetime(time1_date + ' 18:00:00'), pd.to_datetime(time1_date + ' 08:00:00')
# if stop exceeds 18:00:00, compute time difference from this hour 
tmp['time_diff_rule1'] = np.where(tmp.time2 > tmp.rule18, (tmp.time2 - tmp.rule18), (tmp.time2 - tmp.time1))
# rearrange the dataframe with your second rule
tmp['time_diff_rule2'] = np.where((tmp.time2 < tmp.rule18) & (tmp.time1 > tmp.rule08), 0, tmp['time_diff_rule1'])

  time_diff_rule1    time_diff_rule2  
0 02:00:00           02:00:00  
1 04:00:00           00:00:00  
2 03:54:00           03:54:00  
3 04:00:00           00:00:00  
4 04:00:00           04:00:00  
5 15:00:00           15:00:00  
相关问题