【问题标题】:Subtract values from different times in same pandas data frame在同一个熊猫数据框中从不同时间减去值
【发布时间】:2015-07-14 06:09:39
【问题描述】:

我有一个像这样的时间序列:

            value     identifier
2007-01-01  0.781611      55
2007-01-01  0.766152      56
2007-01-01  0.766152      57
2007-01-03  0.733152      57
2007-01-12  0.766152      57
2007-02-01  0.705615      55
2007-02-01  0.032134      56 
2007-02-07  0.132134      56 
2007-02-01  0.032134      57
2008-01-01  0.026512      55
2008-01-01  0.993124      56
2008-01-01  0.993124      57
2008-01-11  0.226512      56
2008-02-01  0.226420      55
2008-02-01  0.033860      56
2008-02-01  0.033860      57
2008-02-14  0.333860      55
2008-02-24  0.334860      57

现在我想计算不同时间增量的差异。我的第一个方法是

last_date = '2008-02-30'
dt = datetime.timedelta(days=30)
delta_30d = datetime.datetime.strptime(last_date, "%Y-%m-%d") - dt
df.loc[last_date]['value'] - df.loc[delta_30d]['value']

但如果时间增量上的完全相同的日期不存在,我会得到

'the label [2008-01-30 00:00:00] is not in the [index]'

所以这是不行的。如何从请求的时间增量中获取最接近的日期并计算差异?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果您的索引是唯一的,您可以使用DateTimeIndex.asof,如question 所示。

    另一种方法(来自同一个问题)是使用numpy.argmin 来查找最近的日期。例如,你可以这样做

    In [138]: import numpy as np
    
    In [139]: last_date = pd.Timestamp('2008-01-30')
    
    In [140]: delta_30d = last_date - pd.Timedelta(30, 'D')
    
    In [142]: np.argmin(np.abs(df.index - delta_30d))
    Out[142]: 13
    
    In [144]: df.iloc[13, :]
    Out[144]: 
    value          0.22642
    identifier    55.00000
    Name: 2008-02-01 00:00:00, dtype: float64
    
    In [145]: df.iloc[np.argmin(np.abs(df.index - last_date))]['value'] - df.iloc[np.argmin(np.abs(df.index - delta_30))]['value']
    Out[145]: 0.19990799999999997
    

    【讨论】:

    • 谢谢。有没有办法可以将其应用于列中的所有值?
    • 如果索引有重复的日期值,这实际上不能正常工作。
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2013-12-04
    • 2018-08-06
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多