2013-05-28 26 views
5

Sử dụng gấu trúc tôi có thể chỉ là một chuỗi thời gian sử dụng một đối tượng datetime (với một tháng và ngày) và có được giá trị trong một thời gian, ví dụ:Tạo gấu trúc chuỗi thời gian với một tháng nhưng không phải là một năm

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

Có bất kỳ cách nào để xác định một khoảng thời gian với một tháng nhưng không có một năm? Tôi có một hồ sơ cá nhân bình quân hàng năm với tần suất hàng tháng, mà tôi muốn để có thể chỉ số theo tháng/ngày, ví dụ:

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

Đối tượng Thời gian dường như không hỗ trợ này (nó ném một lỗi). Có cách nào tốt hơn để làm điều này hơn là tạo ra các bộ đếm thời gian với một năm, sau đó sửa đổi các đối tượng datetime trước khi nó được sử dụng để lập chỉ mục các timeseries?

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

Sửa 1:

Để làm rõ một chút lý do tại sao tôi muốn làm điều này: Tôi có một mô hình mà tính trên một timestep hàng ngày. Tôi có một biến trong mô hình đó là một đối tượng datetime đại diện cho ngày hiện tại. Tôi cần phải kiểm tra ngày hiện tại đối với nhiều lần, một số trong đó có một ngày đầy đủ (năm/tháng/ngày) nhưng những người khác chỉ có một tháng. Tôi đã hy vọng cho một cái gì đó liền mạch như lập chỉ mục, như các bộ đếm thời gian/hồ sơ được cung cấp bởi người sử dụng trong thời gian chạy. Tôi đã có một đi tại trọng các phương pháp __getitem__ của đối tượng TimeSeries (để tôi có thể sửa chữa những năm đằng sau hậu trường), nhưng có vẻ như một chút của một hack điên.

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)] 

Trả lời

1

Hãy thử 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' trông rất hữu ích, nhưng nó không trả lời câu hỏi cơ bản của tôi về việc tạo chuỗi thời gian mà không có một năm. – Snorfalorpagus

Các vấn đề liên quan