2017-01-05 85 views
1

我建立了一個例程,它使用不同的頻率和週期創建了一個日期列表,我唯一不能工作的就是在月末使用'M'時使用週期。使用頻率和週期的日期範圍

def run_date_creator(start_date, end_date, steps, interval): 
    #Interval: Days(d or D), Weeks (w or W), Month (m or M), Quarters (q or Q) and Years(y or Y) 
    start_date = pd.to_datetime(start_date) 
    end_date = pd.to_datetime(end_date) 
    if interval == 'd' or interval == 'D': 
     dates = pd.date_range(start_date, end_date, freq=pd.tseries.offsets.DateOffset(days=1*steps)) 
    elif interval == 'w': 
     dates = pd.date_range(start_date, end_date, freq=pd.tseries.offsets.DateOffset(days=7*steps)) 
    elif interval == 'bm' or interval == 'BM': 
     dates = pd.date_range(start_date, end_date, freq=pd.tseries.offsets.DateOffset(months=1*steps)) 
    elif interval == 'em' or interval == 'EM': 
     dates = pd.date_range(start_date, end_date, freq='M') 
    elif interval == 'q' or interval == 'Q': 
     dates = pd.date_range(start_date, end_date, freq=pd.tseries.offsets.DateOffset(months=3*steps)) 
    elif interval == 'y' or interval == 'Y': 
     dates = pd.date_range(start_date, end_date, freq=pd.tseries.offsets.DateOffset(months=12*steps)) 
    return list(dates.strftime("%Y-%m-%d")) 

start_date = '2017-1-1' 
end_date = '2017-12-31' 

dates = run_date_creator(start_date, end_date , 2, 'em') 

在此先感謝。

+0

這個工作對我來說:'pd.date_range(日期,結束日期,頻率= 'M')''給DatetimeIndex([ '2017年1月31日', '2017年2月28日',「2017年-03-31','2017-04-30', '2017-05-31','2017-06-30','2017-07-31','2017-08-31', '2017 -09-30','2017-10-31','2017-11-30','2017-12-31'], dtype ='datetime64 [ns]',freq ='M')' – EdChum

+0

抱歉錯字,它的意思是使用steps = 2來得到你'2017-01-31','2017-03-31','2017-05-31'等 – ThatQuantDude

+0

夫婦的事情:1)你說你的問題是隻有'M',但我沒有看到你使用'M'。你的意思是'EM'? 2)如果這真的是你唯一的問題,你應該孤立你的例子,只包括這一點。 3)考慮使用字典而不是所有那些'if/elif'語句。 4)使用例如'interval.lower()=='d''而不是檢查大寫和小寫的間隔(處理你得到''Em''的情況) –

回答

1

您可以指定freq中的步驟。

dates = pd.date_range(start_date, end_date, freq='%dM' % steps)