我有以下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
开始。我怎么能这样做?
我怀疑它与closed
函数的label
和resample
值有关,但在文档中没有很好地解释这些值。
这是一个重建数据框的片段:
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'])
答案 0 :(得分:1)
由于您希望包含与最后一个start_time
和PeriodIndex
对应的end_time
,因此DF.resample
中存在的关键字参数几乎无济于事在这里,因为这些操作作为一个整体/相互排斥的性质(意味着改变任何arg会影响start_time
或end_time
,但不会影响两者。
相反,您可以对这些进行缩减采样,以采用日期频率"D"
,然后在30分钟内对每个组执行均值聚合。
df.resample('D').asfreq().resample('30T').mean()
如果要对convention
或start_time
进行重新采样,则可以使用end_time
arg。
要检查:
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
的样本,其中由于其归一化(时间调整为午夜)而导致的日期最多且不包括2009-02-28
.resample('D')
操作。