【问题标题】:Compute the nth day from the first event in Pandas计算 Pandas 中第一个事件的第 n 天
【发布时间】:2012-10-20 20:02:54
【问题描述】:

我有以下数据框,从我的原始数据框中子集,包含 eventunixtimeday 列,我想要添加另一列 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

【问题讨论】:

    标签: python datetime pandas


    【解决方案1】:
    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
    

    【讨论】:

    • 您好,感谢您的回答。但是,它不适用于我的数据框,可能是因为它不是列 day 不是日期时间对象(尽管我认为它应该是)。请参阅上面的修改。
    • 您好@root,再次感谢您的更新。我让它在上面的虚拟数据框上工作,它的索引为 0,1,2。但在我的实际数据框中,它不起作用,这是因为df.get_value(index,col) 为第一个参数采用索引。它在虚拟数据帧上起作用的原因是'event'==1 在逻辑上为 False,而 Python 将 False 关联为 0,因此在这种情况下返回 index[0]。如果将其更改为'event'=='event',逻辑上为True,则返回第二天datetime.date(2012, 9, 6)。我现在正试图找到一种方法来返回访问 1 的索引。
    • 谢谢@root,这很有帮助!作为后续问题,您将如何将相同的功能应用于组? (见更新的问题)。再次感谢!
    • @S.zhen -- 你不应该通过更新来问“后续”问题。如果您有新问题,请提出新问题。问题/答案必须保持具体,这样它们也会使其他用户受益,他们可能有类似的问题,而不是成为个人教程。
    • @root,很抱歉。我已经将其反转为原始问题。我会在其他地方问我的新问题。谢谢。
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多