Панды 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

а так проблемы с високосными годами. Как я мог сделать, чтобы между датами был ровно один календарный год, несмотря на високосные годы?


person user3166747    schedule 06.01.2014    source источник
comment
Вы хотите добавить ровно единицу к номеру года плюс шесть часов? Или вы просто хотите увеличить год на единицу? Я бы сказал, что календарный год определен правильно, если вы используете _1 _..., но, может быть, вы можете уточнить?   -  person Justin    schedule 07.01.2014
comment
Я добавил шесть часов в надежде иметь точный день рождения каждый год (включая високосные годы), потому что у меня был неправильный результат с 365D, год был 365,25 ... С 1A я получаю каждый год точно, но 31 декабря, что не является день рождения интересный!   -  person user3166747    schedule 08.01.2014


Ответы (1)


Вместо того, чтобы использовать 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

Частота равна "Нет", поскольку это не обычная частота ... если вы попытаетесь добавить число год и час, вы увидите:

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
person Andy Hayden    schedule 06.01.2014
comment
Спасибо, ваш ответ правильный, но я хотел бы знать, почему панды не учитывают високосные годы в моем примере. С другой датой начала (например: 1941-01-04) я получаю правильный ответ, но не с 1959-12-09. - person user3166747; 08.01.2014