Pandas date_range, starting from end date to start date

I am trying to create a semi-annual date range using Python. Pandas provides a pd.date_range function to help with this, but I would like my date range to start from the end date and repeat back.

For example, given input:

 start = datetime.datetime(2016 ,2, 8) end = datetime.datetime(2018 , 6, 1) pd.date_range(start, end, freq='6m') 

Result:

 DatetimeIndex(['2016-02-29', '2016-08-31', '2017-02-28', '2017-08-31', '2018-02-28']) 

How to create the following:

 DatetimeIndex(['2016-02-08', '2016-06-01', '2016-12-01', '2017-06-01', '2017-12-01', '2018-06-01']) 
+6
source share
2 answers

With the updated output (from the editing done), you can do something like the following:

 from pandas.tseries.offsets import DateOffset end = datetime.datetime(2018 , 6, 1) start = datetime.datetime(2016 ,2, 8) #Get the range of months to cover months = (end.year - start.year)*12 + end.month - start.month #The frequency of periods period = 6 # in months pd.DatetimeIndex([end - DateOffset(months=e) for e in range(0, months, period)][::-1]).insert(0, start) 

This is a pretty concise solution, although I did not compare battery life, so I'm not sure how fast it is.

Basically, it's just creating the dates you want as a list, and then converting it to a datetime index.

+4
source

This can be done without pandas and use datutil instead. However, it is more active than it can be:

 from datetime import date import math from dateutil.relativedelta import relativedelta #set up key dates start = date(2016 ,2, 8) end = date(2018 , 6, 1) #calculate date range and number of 6 month periods daterange = end-start periods = daterange.days *2//365 #calculate next date in sequence and check for year roll-over next_date = date(start.year,math.ceil(start.month/6)*6,1) if next_date < start: next_date = date(next_date.year+1,next_date.month,1) #add the first two values to a list arr = [start.isoformat(),next_date.isoformat()] #calculate all subsequent dates using 'relativedelta' for i in range(periods): next_date = next_date+ relativedelta(months=+6) arr.append(next_date.isoformat()) #display results print(arr) 
+2
source

All Articles