如何在python中减去时间

时间:2017-04-11 04:37:41

标签: python pandas datetime

我有一个pandas数据帧,其时间以小时为单位:分钟格式(例如09:35),我希望在B列中的连续时间与A列中的相关键之间得到区别。

数据如下所示:

      A        B
1     key1     09:12
2     key1     09:15
3     key1     09:21
4     key2     10:21
5     key2     10:27
6     key2     10:32

输出应该是这样的:

      A        B
1     key1     00:00
2     key1     00:03
3     key1     00:06
4     key2     00:00
5     key2     00:06
6     key2     00:05

或类似的东西:

      A        B
1     key1     0
2     key1     3
3     key1     6
4     key2     0
5     key2     6
6     key2     5

我知道如果B列中的数据是整数,我们可以这样做:

df['B'] = df.groupby('A')['B'].diff().fillna(0).astype(int)

但是,B列中的数据不是整数,而是时间格式。

感谢您解决此问题的任何帮助。

1 个答案:

答案 0 :(得分:1)

计划

  • 使用pd.to_datetime%H:%M格式转换为Timestamp s。是的,日期不正确。但是,一旦我们使用diff
  • ,这无关紧要
  • groupby'A'并使用diff转换为Timedelta s
  • 再次使用pd.to_datetime,因此我们可以使用dt.strftime并格式化回'%H:%M'
pd.to_datetime(df.B).groupby(df.A).diff().fillna(0)

1   00:00:00
2   00:03:00
3   00:06:00
4   00:00:00
5   00:06:00
6   00:05:00
Name: B, dtype: timedelta64[ns]
pd.to_datetime(
    pd.to_datetime(df.B).groupby(df.A).diff().fillna(0)
).dt.strftime('%H:%M')

1    00:00
2    00:03
3    00:06
4    00:00
5    00:06
6    00:05
Name: B, dtype: object
pd.to_datetime(df.B) \
    .groupby(df.A).diff() \
    .fillna(0).dt.total_seconds() \
    .div(60).astype(int)

1    0
2    3
3    6
4    0
5    6
6    5
Name: B, dtype: int64