2016-02-12 127 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