【问题标题】:Add Months to Data Frame using a period column使用期间列将月份添加到数据框
【发布时间】:2019-06-19 13:28:07
【问题描述】:

我希望使用具有整数 1-32 的周期列向我的数据框添加 %Y%m%d 日期列,它表示从定义的环境变量“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

【问题讨论】:

    标签: python python-3.x pandas dataframe datetime


    【解决方案1】:

    你可以使用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]
    

    【讨论】:

    • 此方法的一个问题是“周期”列在我的数据集中可能出现故障(例如,第一行可能显示周期 4,如果定义了 odate,则仍需要将其标记为 20191031如 20190530)
    • 我不确定我是否理解。您的意思是,将月份周期 4 添加到原始日期?
    • 否,所以我的数据集标记有一个未排序的周期列。我的脚本将有一个定义的 odate 变量,它总是对应于我的数据集的第 1 期。我想创建一个新列,用相对于日期的相应月结束日期标记数据集中的所有期间
    • 嗯,如果您可以添加一些相关的示例数据会更容易理解。
    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2015-07-31
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多