2013-05-28 31 views
5

使用熊猫,我可以索引使用DateTime对象(与月,日)一个时间序列,并得到一个时期的值,例如:创建大熊猫时间序列用了一个月,但不是一年

from pandas import * 
ts = TimeSeries([41,45,48],[Period('2012'),Period('2013'),Period('2014')]) 
print ts[datetime(2013,05,17)] 

有任何方式来定义一个月但没有一年的时期?我有一个频率每月平均每年的个人资料,我希望能够通过指数月/日,如:月经对象似乎

ts = TimeSeries(range(1,13),[Period(month=n,freq='M') for n in range(1,13)]) 
print ts[datetime(2013,05,17)] 

不支持这一(它抛出一个错误)。有没有更好的方法来做到这一点,而不是创建一年的时间序列,然后修改日期时间对象,然后再使用索引时间序列?

http://pandas.pydata.org/pandas-docs/dev/timeseries.html#period

编辑1:

要澄清一点,为什么我想这样做:我有计算上每天时间步长的模型。我在模型中有一个变量,它是表示当前日期的日期时间对象。我需要对几个时间序列进行检查,其中一些时间序列有一个完整的日期(年/月/日),但其他的只有一个月。我希望像索引一样无缝,因为时间序列/配置文件是在运行时由用户提供的。我已经开始重写TimeSeries对象的__getitem__方法(这样我就可以修复幕后的几年),但它似乎有点疯狂。

from pandas import * 

class TimeSeriesProfile(TimeSeries): 
    year = 2004 

    def __new__(self, *args, **kwargs): 
     inst = TimeSeries.__new__(self, *args, **kwargs) 
     inst.index = period_range(str(self.year)+str(inst.index[0])[4:], periods=len(inst.index), freq=inst.index.freq) 
     return inst.view(TimeSeriesProfile) 

    def __getitem__(self, key): 
     without_year = datetime(self.year, key.month, key.day, key.hour, key.minute, key.second) 
     return TimeSeries.__getitem__(self, without_year) 

ts = TimeSeriesProfile(range(0, 366), period_range('1996-01-01', periods=366, freq='D')) 

print ts[datetime(2008, 02, 29)] 

回答

1

尝试period_range

In [65]: TimeSeries(range(1, 13), period_range('2013-01', periods=12, freq='M')) 
Out[65]: 
2013-01  1 
2013-02  2 
2013-03  3 
2013-04  4 
2013-05  5 
2013-06  6 
2013-07  7 
2013-08  8 
2013-09  9 
2013-10 10 
2013-11 11 
2013-12 12 
Freq: M, dtype: int64 
+5

'period_range'看起来有用,但它并没有回答我的问题,根本没有关于每年产生的时间序列。 – Snorfalorpagus