2014-01-06 1 views
3

При выполнении этого кода:Panda 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 ... С «1А» я получаю каждый год точно, но 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