Python 使用句点列向数据框添加月份
我希望使用具有整数1-32的周期列将%Y%m%d日期列添加到我的数据帧中,该周期列表示从定义的环境变量“odate”开始的每月数据点(例如,如果odate=20190531,则周期1应为20190531,周期2应为20190630,等等) 我尝试用列中的句点数作为键定义字典,值为odate+MonthEnd(句点-1) 这很好用;但是,我希望改进代码,使其在周期数发生变化时具有灵活性 是否有一个函数允许我在第1个期间用odate填充日期列,然后在后续期间的后续月份结束 示例数据集: odate=20190531Python 使用句点列向数据框添加月份,python,python-3.x,pandas,dataframe,datetime,Python,Python 3.x,Pandas,Dataframe,Datetime,我希望使用具有整数1-32的周期列将%Y%m%d日期列添加到我的数据帧中,该周期列表示从定义的环境变量“odate”开始的每月数据点(例如,如果odate=20190531,则周期1应为20190531,周期2应为20190630,等等) 我尝试用列中的句点数作为键定义字典,值为odate+MonthEnd(句点-1) 这很好用;但是,我希望改进代码,使其在周期数发生变化时具有灵活性 是否有一个函数允许我在第1个期间用odate填充日期列,然后在后续期间的后续月份结束 示例数据集: odate=
period value
1 5.5
2 5
4 6.2
3 5
5 40
11 5
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
所需数据集:
odate=20190531
period value
1 5.5
2 5
4 6.2
3 5
5 40
11 5
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
您可以使用
pd.date\u range()
:
您可以根据需要更改总周期,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
要提高性能,请使用列表理解
:
df['date'] = [odate + pd.offsets.MonthEnd(period-1) for period in df.period]
您可以使用
pd.date\u range()
:
您可以根据需要更改总周期,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
要提高性能,请使用列表理解
:
df['date'] = [odate + pd.offsets.MonthEnd(period-1) for period in df.period]
这种方法的一个问题是,我的数据集中的“period”列可能有问题(例如,第一行可能显示period 4,如果odate定义为20190530,则需要将其标记为20191031),我不确定我是否理解。您的意思是,将月份周期4添加到原始日期吗?否,因此我的数据集被标记为未排序的周期列。我的脚本将有一个定义的odate变量,它将始终对应于我的数据集的周期1。我想创建一个新列,用相对于ODATEHM的相应月末日期标记数据集中的所有期间。如果您可以添加一些相关的样本数据,则更容易理解。此方法的一个问题是“期间”列在我的数据集中可能不正常(例如,第一行可能显示周期4,如果odate定义为20190530,则仍需将其标记为20191031)我不确定我是否理解。你的意思是,将月份周期4添加到原始日期吗?不,因此我的数据集被标记为未排序的周期列。我的脚本将有一个已定义的odate变量,该变量将始终对应于数据集的周期1。我想创建一个新列,用相应的月份标记数据集中的所有周期相对于odateHmm的结束日期如果您可以添加一些相关的示例数据,则更容易理解。