2017-08-02 77 views
1
date_time={'Date_Fields':[datetime.date(2014,5,1),datetime.date(2015,5,1),datetime.date(2016,5,1),datetime.date(2018,5,1)]} 
date_time=pd.DataFrame(date_time) 
date_time["Analysis Period"]="" 

如果聲明只是一個小故事,我需要創建一個名爲「分析期」的Ameneded列,將36個月期間拆分爲3個期間。例如(2014年5月 - 2015年4月),(2015年5月 - 2016年4月)和(2016年5月 - 2017年4月)。這是與我們的本地工具一起使用的。如果要將日期/時間拆分爲期間

我能夠用下面的代碼完成這項壯舉,但是我想知道是否有更有效的方法來做到這一點,而無需手動更新日期範圍。 同樣在下面的if語句中,最初我試圖用兩個對應的elif語句來做一個if語句。但是,這似乎沒有鍛鍊。有人能解釋爲什麼?

謝謝

if ((date_time["Date_Fields"]>= datetime.date(2014,5,1)) & (date_time["Date_Fields"]<=datetime.date(2015,4,30))) is not False: 
date_time["Analysis Period"]=np.where(((date_time["Date_Fields"]>= datetime.date(2014,5,1)) & (date_time["Date_Fields"]<=datetime.date(2015,4,30))),'May 2014 to April 2015', date_time["Analysis Period"]) 

if ((date_time["Date_Fields"]>= datetime.date(2015,5,1)) & (date_time["Date_Fields"]<=datetime.date(2016,4,30))) is not False: 
date_time["Analysis Period"]=np.where(((date_time["Date_Fields"]>= datetime.date(2015,5,1)) & (date_time["Date_Fields"]<=datetime.date(2016,4,30))),'May 2015 to April 2016', date_time["Analysis Period"]) 

if ((date_time["Date_Fields"]>= datetime.date(2016,5,1)) & (date_time["Date_Fields"]<=datetime.date(2017,4,30))) is not False: 
date_time["Analysis Period"]=np.where(((date_time["Date_Fields"]>= datetime.date(2016,5,1)) & (date_time["Date_Fields"]<=datetime.date(2017,4,30))),'May 2016 to April 2017',date_time["Analysis Period"]) 
+2

您需要'pd.cut()'。 – DyZ

+0

謝謝,將其解讀。 – Bjc51192

回答

1

設置
考慮數據框date_time

date_time = pd.DataFrame(dict(
    Date_Fields=pd.date_range('2014-05-01', periods=12, freq='Q'), 
    Other_Field=np.arange(12) 
)) 

    Date_Fields Other_Field 
0 2014-06-30   0 
1 2014-09-30   1 
2 2014-12-31   2 
3 2015-03-31   3 
4 2015-06-30   4 
5 2015-09-30   5 
6 2015-12-31   6 
7 2016-03-31   7 
8 2016-06-30   8 
9 2016-09-30   9 
10 2016-12-31   10 
11 2017-03-31   11 

解決方案
使用pd.Series.dt.to_periodfreq='A-Apr指定年結束於四月。

date_time.assign(**{ 
    'Analysis Period': date_time.Date_Fields.dt.to_period('A-Apr') 
}) 

    Date_Fields Other_Field Analysis Period 
0 2014-06-30   0   2015 
1 2014-09-30   1   2015 
2 2014-12-31   2   2015 
3 2015-03-31   3   2015 
4 2015-06-30   4   2016 
5 2015-09-30   5   2016 
6 2015-12-31   6   2016 
7 2016-03-31   7   2016 
8 2016-06-30   8   2017 
9 2016-09-30   9   2017 
10 2016-12-31   10   2017 
11 2017-03-31   11   2017 
+1

偉大的解決方案! – Bjc51192

相關問題