2016-02-12 136 views
1

假設我有以下數據幀(DF)熊貓映射和timedelta缺失值

dataframe without time_diff

我想創建報告每個ID,這是簡單的連續時間戳之間的差的柱:

df['time_diff'] = df.groupby('ID')['Timestamp'].diff() 

其產生

dataframe with time_diff

最後,我想創建另一列hours_diff,以小時形式報告time_diff中的值,以浮點形式給出。忽略微秒精度,我試圖

df['hours_diff'] = df.time_diff.map(lambda t: t.days*24.0 + t.seconds/3600.0) 

以及

df.loc[df.time_diff.notnull()==True,'hours_diff'] = df.loc[df.time_diff.notnull()==True].time_diff.map(lambda t: t.days*24.0 + t.seconds/3600.0) 

這兩個給我

AttributeError: 'numpy.timedelta64' object has no attribute 'days'.

但是,如果我運行命令

print set([type(i) for i in df.time_diff]), 

它告訴我va的數據類型列time_diff中的值是pandas.tslib.Timedeltapandas.tslib.NaTType,這兩者都不是numpy.timedelta64類型。 D型timedelta64產量TimedeltaNaT

回答

0

系列,當你在它們之間迭代,但像.map()apply()功能將其視爲timedelta64

您可以通過.dt accesor使用的系列Timedelta方法:

deltas = pd.date_range('2000-01-01', periods=10).to_series().diff() 
deltas 

2000-01-01  NaT 
2000-01-02 1 days 
2000-01-03 1 days 
2000-01-04 1 days 
2000-01-05 1 days 
2000-01-06 1 days 
2000-01-07 1 days 
2000-01-08 1 days 
2000-01-09 1 days 
2000-01-10 1 days 
Freq: D, dtype: timedelta64[ns] 

deltas.dt.days*24.0 + deltas.dt.seconds/3600.0 

2000-01-01 NaN 
2000-01-02 24 
2000-01-03 24 
2000-01-04 24 
2000-01-05 24 
2000-01-06 24 
2000-01-07 24 
2000-01-08 24 
2000-01-09 24 
2000-01-10 24 
Freq: D, dtype: float64 

猶未:

deltas.dt.total_seconds()/3600. 

2000-01-01 NaN 
2000-01-02 24 
2000-01-03 24 
2000-01-04 24 
2000-01-05 24 
2000-01-06 24 
2000-01-07 24 
2000-01-08 24 
2000-01-09 24 
2000-01-10 24 
Freq: D, dtype: float64 
+0

謝謝!您的建議對於問題中報告的數據幀完美適用,只需稍加添加/修改: deltas = df ['time_diff']; deltas_hours = deltas.dt.days * 24.0 + deltas.dt.seconds/3600.0; df ['hours_diff'] = deltas_hours; p.s.對不起,遲到的迴應,我在這裏很新,並沒有期待這樣一個及時和有用的答案。再次感謝! – sobes

0

您可以只用np.timedelta64(1, 'S' 分裂timedelta64 )以秒爲單位獲得增量。如果你真的想擺脫微秒級的精度,只需將其舍入到0位數併除以3600即可得到小時數的增量。

實際上,只有例子的倒數第二行是相關的,其餘的是設置數據幀。 (我改變了第二行有更精確的東西,我可以四捨五入)。

import pandas as pd 
import numpy as np 

data = [{'ID': 'X', 'Timestamp': '2014-12-15 00:00:00', 'Quantity': 4}, 
     {'ID': 'X', 'Timestamp': '2014-12-15 01:25:00.435', 'Quantity': 7}, 
     {'ID': 'X', 'Timestamp': '2014-12-15 02:00:00', 'Quantity': 5}, 
     {'ID': 'X', 'Timestamp': '2014-12-15 03:00:00', 'Quantity': 5}, 
     {'ID': 'X', 'Timestamp': '2014-12-15 04:00:00', 'Quantity': 0}, 
     {'ID': 'Y', 'Timestamp': '2014-12-15 00:00:00', 'Quantity': 9}, 
     {'ID': 'Y', 'Timestamp': '2014-12-15 01:00:00', 'Quantity': 1}, 
     {'ID': 'Y', 'Timestamp': '2014-12-15 02:00:00', 'Quantity': 3}, 
     {'ID': 'Y', 'Timestamp': '2014-12-15 03:00:00', 'Quantity': 2}, 
     {'ID': 'Y', 'Timestamp': '2014-12-15 04:00:00', 'Quantity': 7}, 
     ] 

df = pd.DataFrame(data) 
df['Timestamp'] = pd.to_datetime(df['Timestamp']) 

df['time_diff'] = df.groupby('ID')['Timestamp'].diff() 
df['hour_diff'] = (df['time_diff']/np.timedelta64(1, 's')).round(0)/3600 

print(df) 

輸出:

 
      ID Quantity    Timestamp  time_diff hour_diff 
     0 X   4 2014-12-15 00:00:00.000    NaT  NaN 
     1 X   7 2014-12-15 01:25:00.435 01:25:00.435000 1.416667 
     2 X   5 2014-12-15 02:00:00.000 00:34:59.565000 0.583333 
     3 X   5 2014-12-15 03:00:00.000  01:00:00 1.000000 
     4 X   0 2014-12-15 04:00:00.000  01:00:00 1.000000 
     5 Y   9 2014-12-15 00:00:00.000    NaT  NaN 
     6 Y   1 2014-12-15 01:00:00.000  01:00:00 1.000000 
     7 Y   3 2014-12-15 02:00:00.000  01:00:00 1.000000 
     8 Y   2 2014-12-15 03:00:00.000  01:00:00 1.000000 
     9 Y   7 2014-12-15 04:00:00.000  01:00:00 1.000000 
+0

非常好!謝謝,這個作品完美。遲到的反應,這裏全新的道歉,並沒有期待這樣一個迅速和有用的答案。 – sobes