python pandas中两个datetime.time列之间的微秒差?

2024-09-30 00:24:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python pandas数据框,它包含两列:time1time2

     time1             time2
13:00:07.294234    13:00:07.294234 
14:00:07.294234    14:00:07.394234 
15:00:07.294234    15:00:07.494234 
16:00:07.294234    16:00:07.694234 

如果可能的话,如何生成包含time1time2之间微秒差的第三列?


Tags: 数据pandastime1time2
3条回答

最简单的方法就是这样做:

(pd.to_datetime(df['time2']) - pd.to_datetime(df['time1'])) / np.timedelta64(1, 'us')

如果在hese前面加上实际日期,则可以将它们转换为datetime64列:

In [11]: '2014-03-19 ' + df
Out[11]: 
                        time1                       time2
0  2014-03-19 13:00:07.294234  2014-03-19 13:00:07.294234
1  2014-03-19 14:00:07.294234  2014-03-19 14:00:07.394234
2  2014-03-19 15:00:07.294234  2014-03-19 15:00:07.494234
3  2014-03-19 16:00:07.294234  2014-03-19 16:00:07.694234

[4 rows x 2 columns]

In [12]: df = ('2014-03-19 ' + df).astype('datetime64[ns]')
Out[12]: 
                       time1                      time2
0 2014-03-19 20:00:07.294234 2014-03-19 20:00:07.294234
1 2014-03-19 21:00:07.294234 2014-03-19 21:00:07.394234
2 2014-03-19 22:00:07.294234 2014-03-19 22:00:07.494234
3 2014-03-19 23:00:07.294234 2014-03-19 23:00:07.694234

现在可以减去这些列:

In [13]: delta = df['time2'] - df['time1']

In [14]: delta
Out[14]: 
0          00:00:00
1   00:00:00.100000
2   00:00:00.200000
3   00:00:00.400000
dtype: timedelta64[ns]

要获得微秒数,只需将基础纳秒除以1000:

In [15]: t.astype(np.int64) / 10**3
Out[15]: 
0         0
1    100000
2    200000
3    400000
dtype: int64

正如Jeff指出的,在最新版本的numpy上,你可以除以1微秒:

In [16]: t / np.timedelta64(1,'us')
Out[16]: 
0         0
1    100000
2    200000
3    400000
dtype: float64

一开始我以为这里没有正确的答案,因为没有绿色的滴答声。但正如杰夫在评论中指出的,我错了。

不管怎样,这都是我的贡献。

首先,显而易见的是,将datetime.time变成timedelta

df['delta'] = (pd.to_timedelta(df.time2.astype(str)) - pd.to_timedelta(df.time1.astype(str)))

             time1            time2           delta
0  13:00:07.294234  13:00:07.294234        00:00:00
1  14:00:07.294234  14:00:07.394234 00:00:00.100000
2  15:00:07.294234  15:00:07.494234 00:00:00.200000
3  16:00:07.294234  16:00:07.694234 00:00:00.400000

现在我们有了timedelta,我们可以简单地将它除以一微秒,得到微秒数。

df['microsecond_delta'] = df.delta / pd.np.timedelta64(1, 'us')

             time1            time2           delta  microsecond_delta
0  13:00:07.294234  13:00:07.294234        00:00:00                  0
1  14:00:07.294234  14:00:07.394234 00:00:00.100000             100000
2  15:00:07.294234  15:00:07.494234 00:00:00.200000             200000
3  16:00:07.294234  16:00:07.694234 00:00:00.400000             400000

我不得不补充,这是非常反直觉的,但似乎这是唯一的办法。似乎没有办法直接访问毫秒。我尝试通过应用lambda函数,比如:

df.delta.apply(lambda x: x.microseconds)
AttributeError: 'numpy.timedelta64' object has no attribute 'microseconds'

对于secondsnanosecondsmilliseconds等等,情况也是如此。。。

相关问题 更多 >

    热门问题