【问题标题】:Resample/Upsample Period Index and using both extreme time "edges" of the data重采样/上采样周期索引并使用数据的两个极端时间“边缘”
【发布时间】:2017-06-01 11:16:58
【问题描述】:

我有以下 DataFrame,一个带有周期索引的每周价格数据时间序列。我们就叫它df

                            timestamp         open        high        low        close  volume
timestamp                       
2009-02-01/2009-02-07   733442.166309   830.540773  832.586910  828.788627  830.706009  48401.952790
2009-02-08/2009-02-14   733449.166309   839.945279  841.763948  837.812232  839.742489  53429.330472
2009-02-15/2009-02-21   733456.245777   790.733108  792.399775  788.897523  790.549550  50671.887387
2009-02-22/2009-02-28   733463.166309   760.586910  762.640558  758.234979  760.428112  60565.506438

如果我尝试使用df.resample('30min').mean() 对其重新采样,则数据以2009-02-22 结尾。我希望它以2009-02-28 结束,同时仍以2009-02-01 开始。我该怎么做?
我怀疑这与resample 函数的closedlabel 值有关,但文档中没有很好地解释这些。

这里有一个 sn-p 来重建数据帧:

import pandas as pd
from pandas import Period
dikt={'volume': {Period('2009-02-01/2009-02-07', 'W-SAT'): 48401.952789699571, Period('2009-02-08/2009-02-14', 'W-SAT'): 53429.330472103007, Period('2009-02-15/2009-02-21', 'W-SAT'): 50671.887387387389, Period('2009-02-22/2009-02-28', 'W-SAT'): 60565.506437768243}, 'close': {Period('2009-02-01/2009-02-07', 'W-SAT'): 830.70600858369096, Period('2009-02-08/2009-02-14', 'W-SAT'): 839.74248927038627, Period('2009-02-15/2009-02-21', 'W-SAT'): 790.54954954954951, Period('2009-02-22/2009-02-28', 'W-SAT'): 760.42811158798281}, 'open': {Period('2009-02-01/2009-02-07', 'W-SAT'): 830.54077253218884, Period('2009-02-08/2009-02-14', 'W-SAT'): 839.94527896995703, Period('2009-02-15/2009-02-21', 'W-SAT'): 790.73310810810813, Period('2009-02-22/2009-02-28', 'W-SAT'): 760.58690987124464}, 'high': {Period('2009-02-01/2009-02-07', 'W-SAT'): 832.58690987124464, Period('2009-02-08/2009-02-14', 'W-SAT'): 841.76394849785413, Period('2009-02-15/2009-02-21', 'W-SAT'): 792.39977477477476, Period('2009-02-22/2009-02-28', 'W-SAT'): 762.64055793991417}, 'low': {Period('2009-02-01/2009-02-07', 'W-SAT'): 828.78862660944208, Period('2009-02-08/2009-02-14', 'W-SAT'): 837.8122317596567, Period('2009-02-15/2009-02-21', 'W-SAT'): 788.89752252252254, Period('2009-02-22/2009-02-28', 'W-SAT'): 758.23497854077254}, 'timestamp': {Period('2009-02-01/2009-02-07', 'W-SAT'): 733442.16630901292, Period('2009-02-08/2009-02-14', 'W-SAT'): 733449.16630901292, Period('2009-02-15/2009-02-21', 'W-SAT'): 733456.24577702698, Period('2009-02-22/2009-02-28', 'W-SAT'): 733463.16630901292}}
pd.DataFrame(dikt, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])

【问题讨论】:

    标签: python parsing pandas


    【解决方案1】:

    由于您想包含对应于第一个 PeriodIndexstart_time 和对应于最后一个 end_timeDF.resample 中的关键字参数在这里没有什么帮助,因为它们作为一个整体运行/本质上是互斥的(这意味着更改任何 arg 都会影响 start_timeend_time 但不会同时影响两者)。

    相反,您可以对这些样本进行下采样以采用日频率"D",然后在 30 分钟内对每个组执行均值聚合。

    df.resample('D').asfreq().resample('30T').mean()
    

    如果要在 start_timeend_time 之间执行重采样,则可以使用 convention 参数。


    检查:

    resamp_start = df.resample('30min').mean()
    resamp_all = df.resample('D').asfreq().resample('30T').mean().head(resamp_start.shape[0])
    resamp_start.equals(resamp_all)
    True
    

    如果您只需要重新采样的索引而不需要它的聚合,那么将其当前频率下采样到与要重新采样的频率相对应的最低整数频率是有意义的[这里,1 分钟] 然后对每 30 分钟 个样本进行每 30 行的切片计算。

    df.resample('T').asfreq().iloc[::30]
    

    这些将为您提供整个 2009-02-28 的样本,而较早的情况相比,由于 .resample('D') 操作期间施加的归一化(时间调整到午夜)而考虑到直到但不包括 2009-02-28 的日期.

    【讨论】:

    • 是的,谢谢。为什么使用“D”频率的中间步骤会改变结果,这让我有点困惑?
    • 从每周到每天进行下采样频率的原因是为了确保我们将开始和结束期间日期作为DateTimeIndex 的一部分,以便我们推断我们的结果。 asfreq() 然后扮演修改这个角色并填补缺失日期的空白。
    • 文档中也提到了使用.asfreq() 重新采样周期的方法。阅读:pandas.pydata.org/pandas-docs/stable/…
    • 不,我的问题是为什么我不能直接从每周重新采样到 30 分钟并获得正确的结果。这是一个非常讨厌的黑客......当我对实际平均值不感兴趣而只对重新采样的索引感兴趣时,我不得不使用 .mean() 已经够糟糕了......
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2018-09-28
    • 2021-01-28
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多