2012-10-31 56 views
2

第一事件的第n天,我有以下的数据帧,从我的原始数据帧子集,与列事件unixtime,我想补充另一列arbday这是自第一事件,对第n天(与第一次访问是1天):计算从熊猫

import numpy as np 
import datetime as dt 

>>> testdf = pd.DataFrame({'event': range(1,4), 'unixtime': [1346617885925, 1346961625305,1347214217566]},index=[343352,343353,343354]) 
>>> testdf['day'] = testdf['unixtime'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()) 

     event  unixtime   day arbday 
343352  1 1346617885925 2012-09-02  1 
343353  2 1346961625305 2012-09-06  5 
343354  3 1347214217566 2012-09-09  8 

环顾四周后,我试着这样做:

>>> testdf2['arbday'] = np.where(testdf2['event']==1, 1, testdf2.day.apply(lambda x: x-x[:1])) 
     event  unixtime   day arbday 
343352  1 1346617885925 2012-09-02  1 
343353  2 1346961625305 2012-09-06  NaN 
343354  3 1347214217566 2012-09-09  NaN 

or 

>>> testdf2['arbday'] = np.where(testdf2['event']==1, 1, testdf2.day.apply(lambda x: dt.timedelta(x-x[:1]))) 
TypeError: 'datetime.date' object is not subscriptable 

这样做的正确方法是什么?任何指针非常感谢!

编辑:关于在组上应用这个问题的后续问题是here

回答

2
df = DataFrame({'event': range(1,4), 'unixtime': [1346617885925, 1346961625305,1347214217566]}) 
df['day'] = df['unixtime'].apply(lambda x: datetime.fromtimestamp(x/1000).date()) 
df['arbday']=df['day'].map(lambda x: (x-df.get_value(df[df.event == 1].first_valid_index(), 'day')).days+1) 
print df 

输出:

event  unixtime   day arbday 
0  1 1346617885925 2012-09-02  1 
1  2 1346961625305 2012-09-06  5 
2  3 1347214217566 2012-09-09  8 
+0

您好,感谢您的回答。但是,它不适用于我的数据框,可能是因为它不是列_day_不是日期时间对象(尽管我认为它应该是)。请参阅上面的编辑。 –

+0

Hello @root,再次感谢您的更新。我得到它在上面的虚拟数据框上工作,索引为0,1,2。但是,在我的实际数据框中,它不起作用,这是因为'df.get_value(index,col)'为第一个参数提供索引。它在dummy数据框上工作的原因是''event'== 1'在逻辑上是False,Python将False与0关联,因此在这种情况下返回索引[0]。如果将其更改为“event”=='event''(逻辑上为True),则返回第二天_datetime.date(2012,9,6)_。我现在试图找到一种方式来返回访问索引1. –

+0

@根,我已经更新了这个问题。 –