我希望使用带有整数1-32的period列将%Y%m%d date列添加到我的数据框中,该列表示从定义的环境变量“ odate”开始的每月数据点(例如,如果为odate = 20190531,则期间1应该为20190531,期间2应该为20190630,依此类推)
我尝试定义了一个字典,该字典以列中的句点数作为键,值是odate + MonthEnd(period -1)
这很好并且很好;但是,鉴于周期数的变化,我想提高代码的灵活性。
是否有一个功能可以让我在时段1中用odate填充日期列,然后在随后的时段中使用下一个月末?
示例数据集:
odate = 20190531
period value
1 5.5
2 5
4 6.2
3 5
5 40
11 5
所需数据集:
odate = 20190531
period value date
1 5.5 2019-05-31
2 5 2019-06-30
4 6.2 2019-08-31
3 5 2019-07-31
5 40 2019-09-30
11 5 2020-03-31
答案 0 :(得分:2)
您可以使用pd.date_range()
:
pd.date_range(start = '2019-05-31', periods = 100,freq='M')
您可以根据需要更改总期限,freq='M'
表示月末频率
Here是可用于freq
参数的偏移别名的列表。
如果您只想在日期上增加或减去某个时期,则可以使用pd.DataOffset
:
odate = pd.Timestamp('20191031')
odate
>> Timestamp('2019-10-31 00:00:00')
odate - pd.DateOffset(months=4)
>> Timestamp('2019-06-30 00:00:00')
odate + pd.DateOffset(months=4)
>> Timestamp('2020-02-29 00:00:00')
要将给定的期间列添加到“月末”:
odate = pd.Timestamp('20190531')
df['date'] = df.period.apply(lambda x: odate + pd.offsets.MonthEnd(x-1))
df
period value date
0 1 5.5 2019-05-31
1 2 5.0 2019-06-30
2 4 6.2 2019-08-31
3 3 5.0 2019-07-31
4 5 40.0 2019-09-30
5 11 5.0 2020-03-31
要提高性能,请使用list-comprehension
:
df['date'] = [odate + pd.offsets.MonthEnd(period-1) for period in df.period]