Как создать pandas DatetimeIndex с частотой года?

Используя pandas.date_range(startdate, periods=n, freq=f) вы можете создать диапазон объектов Timestamp pandas, где дополнительный параметр freq обозначает частоту (секунда, минута, час, день...) в диапазоне.

В документации не упоминаются литералы, которые, как ожидается, будут переданы, но через несколько минут вы сможете легко найти большинство из них.

  • 's': второй
  • 'мин': минута
  • "H": час
  • 'D': день
  • 'w': неделя
  • 'm': месяц

Тем не менее, ни один из "y", "Y", "yr" и т.д. Не создает даты с годом в качестве частоты. Кто-нибудь знает, что пройти, или если это вообще возможно?

Ответ 1

Ежегодная индексация к началу или концу года

Частота - freq='A' для частоты на конец года, 'AS' для начала года. Проверьте псевдонимы в документации.

например. pd.date_range(start=pd.datetime(2000, 1, 1), periods=4, freq='A')

возвращается

DatetimeIndex(['2000-12-31', '2001-12-31', '2002-12-31', '2003-12-31'], dtype='datetime64[ns]', freq='A-DEC', tz=None)

Ежегодное индексирование до начала произвольного месяца

Если вам нужно, чтобы он был годовым с определенного времени, используйте привязанное смещение, например. pd.date_range(start=pd.datetime(2000, 1, 1), periods=10, freq='AS-AUG')

возвращается

DatetimeIndex(['2000-08-01', '2001-08-01', '2002-08-01', '2003-08-01'], dtype='datetime64[ns]', freq='AS-AUG', tz=None)

Ежегодное индексирование с произвольной даты

Чтобы индексировать с произвольной даты, начните серию в эту дату и используйте пользовательский объект DateOffset.

например. pd.date_range(start=pd.datetime(2000, 9, 10), periods=4, freq=pd.DateOffset(years=1))

возвращается

DatetimeIndex(['2000-09-10', '2001-09-10', '2002-09-10', '2003-09-10'], dtype='datetime64[ns]', freq='<DateOffset: kwds={'years': 1}>', tz=None)

Ответ 2

Со всеми этими хаками существует четкий способ:

pd.date_range(start=datetime.datetime.now(),periods=5,freq='A')

A: Ежегодно.

365D? В самом деле? Как насчет високосных лет?

Ответ 3

Вы можете использовать месяц, а затем выбирать каждый 12-й месяц:

months=pandas.date_range(start=datetime.datetime.now(),periods=120,freq='M')
year=[months[11*i] for i in range(12)]

Вы также можете сделать:

usingDays=pandas.date_range(start=datetime.datetime.now(),periods=10,freq='365D')

но это не будет работать так хорошо с високосными годами.

Ответ 4

Вы можете использовать кратность для частотных строк. Например:

pd.date_range ('01/01/2010', периоды = 10, частота = '365d')

Этот код даст вам серию 01/01/2010, 01/01/2011 и т.д., Которые, я думаю, являются тем, что вы ищете. Конечно, проблема здесь в том, что вы столкнетесь с проблемами с високосными годами.