请考虑以下代码:
r = pandas.date_range(datetime(2014,5,26),datetime(2014,6,6))
ts = pandas.Series(np.random.randn(len(r)), index=r)
print(ts.asfreq(pandas.DateOffset(days=5),how='end'))
我认为我没有正确理解应该如何使用“how”参数。 使用上面的代码,我原本期望从结尾开始,asfreq的结果将每5天返回一次。我仍然得到:
2014-05-26 0.456856
2014-05-31 -0.552287
2014-06-05 0.169554
Freq: <DateOffset: kwds={'days': 5}>, dtype: float64
如果我这样做
print(ts.asfreq(pandas.DateOffset(days=5),how='start'))
现在产生差异并获得完全相同的结果。
然后我在pandas.Series.asfreq的文档中看到了以下内容:
how : {‘start’, ‘end’}, default end
For PeriodIndex only, see PeriodIndex.asfreq
,指出问题,因为在我的情况下,我需要使用DatetimeIndex。
我的问题是,我的例子中的正确电话是什么,总是返回一个系列,最后一点是2014-05-30,对于结束日期为2014-6-6的范围,无论我在范围内设定的开始日期? asfreq似乎不适用于降序索引,所以反转索引似乎也不是一个选项......
答案 0 :(得分:1)
要回答您的问题,这里有几个问题需要解决:
首先,我不太明白在这里使用DateOffset,你可以简单地用&#34; 5D&#34;它会产生相同的结果。
其次,更好的做法是使用period_range生成时间索引。第三点之后显示了一个例子。
最后,似乎你不明白asfreq正在做什么&#34;怎么&#34;使用选项。简而言之,&#34;如何&#34;选项用于&#34; freq&#34;内部asfreq设置为更大的频率(或更小的时间间隔)。让我用下面的例子来说明这一点:
import pandas as pd
import numpy as np
rng = pd.period_range('20140526','20140606')
如果我将频率设置为&#34;开始&#34;:
print(rng.asfreq('H', how='start'))
结果是:
PeriodIndex(['2014-05-26 00:00', '2014-05-27 00:00', '2014-05-28 00:00',
'2014-05-29 00:00', '2014-05-30 00:00', '2014-05-31 00:00',
'2014-06-01 00:00', '2014-06-02 00:00', '2014-06-03 00:00',
'2014-06-04 00:00', '2014-06-05 00:00', '2014-06-06 00:00'],
dtype='int64', freq='H')
当天所有时间都设定为00:00。
然而,如果&#34;怎么&#34;设置为&#34;结束&#34;
print(rng.asfreq('H', how='end'))
结果变为:
PeriodIndex(['2014-05-26 23:00', '2014-05-27 23:00', '2014-05-28 23:00',
'2014-05-29 23:00', '2014-05-30 23:00', '2014-05-31 23:00',
'2014-06-01 23:00', '2014-06-02 23:00', '2014-06-03 23:00',
'2014-06-04 23:00', '2014-06-05 23:00', '2014-06-06 23:00'],
dtype='int64', freq='H')
所有小时都设置为23:00,换句话说,就是每天的最后一小时时间戳。
所以这里的重点是:&#34;&#34;&#34;当新频率(小时)大于旧频率(小时)时,仅非常有用。但在这种情况下,您不是对时间序列进行子集化或重新采样,而是根据新频率为每个时间点提供新索引。
至于如何实现目标,因为您在所有重要时间点前缀,为什么不使用这些时间点创建期间索引:
r = pd.period_range('20140530','20140609',freq="5D")
print(r)
PeriodIndex(['2014-05-30', '2014-06-04', '2014-06-09'], dtype='int64', freq='5D')