如果声明将日期/时间分成句点

时间:2017-08-02 17:33:23

标签: python pandas numpy

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"])

1 个答案:

答案 0 :(得分: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一起使用,以指定在4月结束的年度期间。

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