我从一个月的系列开始,加盖了这个月底的时间戳.我想通过填写远期价值来提高他们的日常工作频率(星期一至星期五)。我希望有两个条件是正确的:
虽然不优雅,但我得出的结论是,最安全的方法是:
daily_series = monthly_series.resample(rule='D').ffill().resample(rule='B',how='first')现在,意外的情况是:
dates = ['1953-02-28', '1953-03-31', '1953-04-30', '1953-05-31']
# '1953-02-28' was a Saturday
values = [1,2,3,4]
monthly_ts = pd.Series(values, index = dates)
monthly_ts
Out[74]:
1953-02-28 1
1953-03-31 2
1953-04-30 3
1953-05-31 4
dtype: int64
daily_ts = monthly_ts.resample(rule='D').ffill().resample(rule='B',how='first')
Out[77]:
1953-02-27 1 # Why do I have this observation?
1953-03-02 1
1953-03-03 1
1953-03-04 1星期六的观测是在星期五重新取样时使用的。这发生在.resample之后(规则= 'B')
请你向我解释一下为什么会发生这种情况,以及如何防止这种情况发生?
发布于 2016-05-20 12:36:52
这种行为方式发生的原因是让抽样周期过短。间隔中的工作日数量小于日历日。这就是为什么星期五和星期一被加入到周六和周日,并代表为一个单一的单位。周六和周日的值用于“如何”和“关闭”参数的下采样。
dates = ['1953-02-28', '1953-03-31', '1953-04-30', '1953-05-31']
values = [1,2,3,4]
monthly_ts = pd.Series(values, index = pd.to_datetime(dates))首先向上样至日历日
calendar_daily_ts = monthly_ts.resample(rule='D').ffill()让我们来看看最后三张唱片
In[8]: calendar_daily_ts[-3:]
Out[8]:
1953-05-29 3
1953-05-30 3
1953-05-31 4
Freq: D, dtype: int64如果我们将样本降到平均和结束为‘左’的工作日,最后的值将是3.33333。
In [15]: calendar_daily_ts.resample(rule='B', closed='left').mean()[-2:]
Out[15]:
1953-05-28 3.000000
1953-05-29 3.333333
Freq: B, dtype: float64星期五的数值(1953-05-29)是按星期五、星期六和星期日(3 +3+ 4) /3的平均值计算的。
如果我们将样本降到平均和封闭的工作日=“对”,最后的值将是3.5
In [16]: calendar_daily_ts.resample(rule='B', closed='right').mean()[-2:]
Out[16]:
1953-05-28 3.0
1953-05-29 3.5
Freq: B, dtype: float64星期五的数值(1953-05-29)按星期六、星期日和下星期一(3 +4+ 0) /2的平均值计算。
这没有星期五的价值。
所以你问题中的观察之所以出现,是因为1953-02-28 (星期六)下采样期包括1953-02-27、1953-02-28、1953-03-01和1953-03-02。默认情况下,间隔为左- (1953-02-27,1953-02-28,1953-03-01)。你得到了第一个- 1953-02-27
还有一个有趣的例子
In [45]: calendar_daily_ts[:4]
Out[45]:
1953-02-27 1
1953-02-28 2
1953-03-01 3
1953-03-02 4
dtype: int64
In [47]: calendar_daily_ts.resample(rule='B', closed='left').first()[:4]
Out[47]:
1953-02-27 1
1953-03-02 4
1953-03-03 1
1953-03-04 1
Freq: B, dtype: int64
In [48]: calendar_daily_ts.resample(rule='B', closed='right').first()[:4]
Out[48]:
1953-02-26 1
1953-02-27 2
1953-03-02 1
1953-03-03 1
Freq: B, dtype: int64(1953-02-26,值1)
https://stackoverflow.com/questions/37342089
复制相似问题