2014-03-19 67 views
5

我有一个python熊猫数据帧,它包含2列:time1time2python pandas中两个datetime.time列之间的微秒差异?

 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之间的微秒差的第三列中,在整数如果可能?

回答

3

如果你在前面加上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 

正如杰夫指出,在最近的版本numpy的的NS您可以通过1微秒划分:

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

还可以''np.timedelta64分(1, '我们')' ' – Jeff

0

最简单的方法就是要做到这一点:

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

+0

这个解决方案给了我'TypeError:不支持的操作数类型--s'datetime.time'和'datetime.time'' – firelynx

-1

使用dateutil你可以改变你的时间戳列‘真正’的时间戳:

df.time1 = df.time1.apply(dateutil.parser.parse) df.time2 = df.time2.apply(dateutil.parser.parse)

之后,你要定义这样一个新列:

df['delta'] = df.time2 - df.time1

0

起初我还以为那里是由于没有绿色蜱在这里没有正确答案。但正如杰夫在评论中指出的那样,我错了。

无论哪种方式是我的贡献。

首先,很明显,使得datetime.timetimedelta

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等真的...

+0

@acushner下面的答案是正确的(虽然没有输出)。使用''.map''的答案效率非常低。 – Jeff

+0

@Jeff我没有看到答案。该死的,所有的研究都没有。 – firelynx

+0

@Jeff当我尝试使用acushners解决方案时,我实际上得到了'unsupported operand type(s)for - :'datetime.time和'datetime.time'。 – firelynx