pandas:使用Timestamps访问Period-indexed数据

时间:2015-01-22 10:58:24

标签: python pandas

使用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]用于我想要的行为。我仍然有兴趣知道为什么使用日期范围时的默认行为与使用单个日期时的默认行为不同。

2 个答案:

答案 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]   

您正尝试使用seriesDatetimeIndex数据编制索引,但您已将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。)

相关问题