2016-02-16 75 views
6

在我試圖使用Python生成一系列的半年度日期。 Pandas提供了一個函數pd.date_range來幫助這個,但是我希望我的日期範圍從結束日期開始並向後迭代。熊貓date_range從結束日期開始日期

例如給定輸入:

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

結果是:

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

我如何可以生成以下:

DatetimeIndex(['2016-02-08', '2016-06-01', '2016-12-01', '2017-06-01', 
       '2017-12-01', '2018-06-01']) 
+1

刪除了我的初始答案。我認爲這裏主要的是抵消,是嗎? – Maximilian

+0

@Maximilian是的,這是另一種說法。 – pyCthon

回答

4

有了更新的輸出(從您所做的編輯),你可以這樣做以下:

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) 

這是一個相當簡潔的解決方案,儘管我沒有比較運行時間,所以我不確定它有多快。

基本上這只是創建您需要作爲列表的日期,然後將其轉換爲日期時間索引。

2

這可以不用熊貓並使用datutil來代替。然而,它更多地參與比它也許應該:

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) 
+0

我在'next_date ='行發現'TypeError:expected expected,float float'錯誤。 – pyCthon

+0

@pyCthon next_date是哪一行?第一個還是for循環中的一個?如果是後者,那麼它可能是你沒有安裝dateutil,我應該提到。 –

+0

第一個,dateutil已安裝,我有''2.4.2'' – pyCthon

相關問題