How to create a pandas DatetimeIndex with year as frequency?

With all those hacks, there is a clear way:

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

A : Annually.

365D? Really? What about leap years?


Annual indexing to the beginning or end of the year

Frequency is freq='A' for end of year frequency, 'AS' for start of year. Check the aliases in the documentation.

eg. pd.date_range(start=pd.datetime(2000, 1, 1), periods=4, freq='A')

returns

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

Annual indexing to the beginning of an arbitrary month

If you need it to be annual from a particular time use an anchored offset, eg. pd.date_range(start=pd.datetime(2000, 1, 1), periods=10, freq='AS-AUG')

returns

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

Annual indexing from an arbitrary date

To index from an arbitrary date, begin the series on that date and use a custom DateOffset object.

eg. pd.date_range(start=pd.datetime(2000, 9, 10), periods=4, freq=pd.DateOffset(years=1))

returns

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


You can use month and then pick every 12th month:

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

You can also do:

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

but that won't work so well with leap years.