2012-11-18 90 views
18

與NumPy和dateutil戰鬥了幾天後,我最近發現了令人驚歎的熊貓圖書館。我一直在閱讀文檔和源代碼,但我無法弄清楚如何讓date_range()在正確的斷點處生成索引。熊貓人的日期範圍

from datetime import date 
import pandas as pd 

start = date('2012-01-15') 
end = date('2012-09-20') 
# 'M' is month-end, instead I need same-day-of-month 
date_range(start, end, freq='M') 

我想要什麼:

2012-01-15 
2012-02-15 
2012-03-15 
... 
2012-09-15 

我得到什麼:

2012-01-31 
2012-02-29 
2012-03-31 
... 
2012-08-31 

我需要一個月大小的塊是佔天在一個月內可變數目。這可能與dateutil.ru:

rrule(freq=MONTHLY, dtstart=start, bymonthday=(start.day, -1), bysetpos=1) 

醜陋和難以辨認,但它的工作原理。我怎樣才能用熊貓做到這一點?我已經玩過date_range()period_range(),到目前爲止沒有運氣。

我的實際目標是使用groupby,crosstab和/或resample來計算每個時期的價值,基於該時期內各個條目的總和/平均值等。換句話說,我想從轉換數據:

   total 
2012-01-10 00:01 50 
2012-01-15 01:01 55 
2012-03-11 00:01 60 
2012-04-28 00:01 80 

#Hypothetical usage 
dataframe.resample('total', how='sum', freq='M', start='2012-01-09', end='2012-04-15') 

   total 
2012-01-09   105 # Values summed 
2012-02-09   0 # Missing from dataframe 
2012-03-09   60 
2012-04-09   0 # Data past end date, not counted 

鑑於大熊貓起源於財務分析工具,我幾乎可以肯定,有一個簡單,快捷的方式做這個。幫助讚賞!

回答

20

freq='M'用於月末頻率(請參閱here)。但是你可以使用.shift通過任意天數(或頻率爲此事)來接班:

pd.date_range(start, end, freq='M').shift(15, freq=pd.datetools.day) 
+0

謝謝,這可能是我需要創建基於RRULE黑客的解決方案的伎倆。但是,這不會對範圍上的重採樣有所幫助,因爲resample仍然會使用與AFAIK月初對齊的分箱。 – knite

+4

如果您要按照一致的天數移動,則使用月開始'MS'更有意義: 'pd.date_range(start,end,freq ='MS')。shift(15,freq = pd。 datetools.day)' –

4

有實際上是沒有頻率「月日」(如「DOMXX」像「DOM09」),但我沒有看到任何理由不添加一個。

http://github.com/pydata/pandas/issues/2289

我不會在那一刻對你有一個簡單的解決方法,因爲resample要求通過已知的頻率規則。我認爲應該增加能夠將任何日期範圍用作任意的邊緣邊緣。的時間,黑客早晚的事情......

+1

這個問題剛剛擊中10K次。也許是時候重新審視這個功能了? – knite

4

嘗試

date_range(start, end, freq=pd.tseries.offsets.DateOffset(months=1)) 
+0

對於'freq = ...'也可以使用pd.DateOffset(months = 1) – calcium3000