2014-01-06 118 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