Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用句点列向数据框添加月份_Python_Python 3.x_Pandas_Dataframe_Datetime - Fatal编程技术网

Python 使用句点列向数据框添加月份

Python 使用句点列向数据框添加月份,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=

我希望使用具有整数1-32的周期列将%Y%m%d日期列添加到我的数据帧中,该周期列表示从定义的环境变量“odate”开始的每月数据点(例如,如果odate=20190531,则周期1应为20190531,周期2应为20190630,等等)

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

这很好用;但是,我希望改进代码,使其在周期数发生变化时具有灵活性

是否有一个函数允许我在第1个期间用odate填充日期列,然后在后续期间的后续月份结束

示例数据集:

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
所需数据集:

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的结束日期如果您可以添加一些相关的示例数据,则更容易理解。