使用Pandas 0.15.2,我创建了一个时间序列(时间段)作为索引:
periods = pandas.PeriodIndex([pandas.Period('2015-01-01'), pandas.Period('2015-01-02')])
series = pandas.TimeSeries([1,2], index=periods)
这使我的系列变量看起来像
In [21]: series
Out[21]:
2015-01-01 1
2015-01-02 2
Freq: D, dtype: int64
既然我的数据已按句点编制索引,我可以使用
获取其中一个句点内的时间戳数据In [22]: series[pandas.Timestamp('2015-01-01-15h')]
Out[22]: 1
但是,我不能使用日期范围作为索引:
In [23]: dates = pandas.date_range('2015-01-01-15h', periods=5, freq='3H')
In [24]: series[dates]
Out[24]:
2015-01-01 15:00:00 NaN
2015-01-01 18:00:00 NaN
2015-01-01 21:00:00 NaN
2015-01-02 00:00:00 NaN
2015-01-02 03:00:00 NaN
Freq: 3H, dtype: float64
我希望输出像
2015-01-01 15:00:00 1
2015-01-01 18:00:00 1
2015-01-01 21:00:00 1
2015-01-02 00:00:00 2
2015-01-02 03:00:00 2
Freq: 3H, dtype: float64
为什么Pandas可以在基于Periods的系列中查找单个时间戳的值, 但不是时间戳数组的值?还有另一种方法来实现这一目标吗? 我可以使用以下内容:
for d in dates:
print(series[d])
但是要省去那些额外的线路会很好。
编辑:我创建了一个小型的Timeseries子类:
class MySeries(pandas.TimeSeries):
def __getitem__(self, key):
if type(key) != pandas.tseries.index.DatetimeIndex:
return super(MySeries, self).__getitem__(key)
else:
values = [self[k] for k in key]
return pandas.TimeSeries(values, key)
允许我将series[dates]
用于我想要的行为。我仍然有兴趣知道为什么使用日期范围时的默认行为与使用单个日期时的默认行为不同。
答案 0 :(得分:2)
你可以这样:
series[dates.to_period(periods.freq)]
得到这个:
2015-01-01 1
2015-01-01 1
2015-01-01 1
2015-01-02 2
2015-01-02 2
Freq: D, dtype: int64
dates.to_period(periods.freq)
将您的dates
转换为与您的index
时间序列相媲美的位置:
dates.to_period(periods.freq)
<class 'pandas.tseries.period.PeriodIndex'>
[2015-01-01, ..., 2015-01-02]
Length: 5, Freq: D
答案 1 :(得分:0)
您遇到的问题是因为您的行:
dates = pandas.date_range('2015-01-01-15h', periods=5, freq='3H')
series[dates]
您正尝试使用series
为DatetimeIndex
数据编制索引,但您已将series
的索引设置为PeriodIndex
并使用以下行:
periods = pandas.PeriodIndex([pandas.Period('2015-01-01'), pandas.Period('2015-01-02')])
series = pandas.TimeSeries([1,2], index=periods)
Out[12]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2015-01-01, ..., 2015-01-09]
<class 'pandas.tseries.period.PeriodIndex'>
[2015-01-01, 2015-01-09]
所以@Primer的答案通过使你的索引类型保持一致来解决这个问题(例如两者都是PeriodIndex
。)