2017-08-02 72 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

相关问题