首页 > 解决方案 > 使用期间列将月份添加到数据框

问题描述

我正在寻找一个 %Y%m%d 日期列添加到我的数据框中,使用具有整数 1-32 的周期列,它表示从定义的环境变量“odate”开始的每月数据点(例如,如果 odate=20190531 那么周期 1 应该是 20190531,周期 2 应该是 20190630,等等)

我尝试定义一个字典,其中列中的句点数作为键,值是 odate + MonthEnd(period -1)

这很好用;但是,鉴于周期数的变化,我想改进代码以使其灵活。

是否有一个函数可以让我用第 1 期的日期填充日期列,然后在随后的月份结束后的日期?

示例数据集:

日期=20190531

period value
1      5.5
2      5
4      6.2
3      5
5      40
11     5

所需的数据集:

日期=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

标签: pythonpython-3.xpandasdataframedatetime

解决方案


您可以使用pd.date_range()

pd.date_range(start = '2019-05-31', periods = 100,freq='M')

您可以根据需要更改总期间,这freq='M'意味着月末频率

是您可以用于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]

推荐阅读