2014-01-06 83 views
3

運行此代碼:熊貓DATE_RANGE和閏年

a = pd.date_range("1959-12-09 00:00:00", "2013-12-09 12:00:00", freq = "365D6H") 
weekDays = [dt.datetime.weekday(d) for d in a] 
df = pd.DataFrame({"Date": a, "Jour": weekDays}) 
df.head(6) 

我越來越:

0 1959-12-09 00:00:00  2 
1 1960-12-08 06:00:00  3 * 
2 1961-12-08 12:00:00  4 
3 1962-12-08 18:00:00  5 
4 1963-12-09 00:00:00  0 
5 1964-12-08 06:00:00  1 * 
6 1965-12-08 12:00:00  2 

等問題閏年。 儘管有閏年,我怎麼能在日期之間恰好有一個日曆年?

+1

你想添加一個到年數加六個小時?或者你只是想增加一年?如果你使用'freq ='1A'',我會說一個日曆年是正確定義的......但也許你可以詳細說明一下嗎? – Justin

+0

我增加了六個小時,希望每年都有確切的生日(包括閏年),因爲我得到了一個錯誤的結果,「365D」,一年365.25 ... ...與「1A」我每年都準確,但在12月31日,這不是興趣的生日! – user3166747

回答

2

而不是使用date_range,您可以創建這個使用列表理解:

In [11]: pd.to_datetime(["%s-12-09 %s:00:00" % (y, (6 * h) % 24) 
          for h, y in enumerate(xrange(1959, 2014))]) 
Out[11]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[1959-12-09 00:00:00, ..., 2013-12-09 12:00:00] 
Length: 55, Freq: None, Timezone: None 

頻率爲無,因爲這不是一個普通的頻率......如果你嘗試添加numpy的一年你會看到一個小時數:

In [21]: np.timedelta64(1, 'Y') + np.timedelta64(6, 'h') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-21-6a7f3e5b3315> in <module>() 
----> 1 np.timedelta64(1, 'Y') + np.timedelta64(6, 'h') 

TypeError: Cannot get a common metadata divisor for NumPy datetime metadata [Y] and [h] because they have incompatible nonlinear base time units 
+1

謝謝,你的回答是正確的,但我想知道爲什麼熊貓沒有考慮我的例子中的閏年。使用不同的開始日期(例如:「1941-01-04」),我得到了正確的答案,但沒有收到「1959-12-09」。 – user3166747