2014-03-19 103 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