将月份添加到 pandas 数据框中的日期变量
Adding months to a date variable in pandas dataframe
我有一个 pandas 数据框如下:
import pandas as pd
df = pd.DataFrame({'date1':['12/1/2019','12/1/2019','12/1/2019'], 'nb_months':[11,11,12]})
df['date1'] = pd.to_datetime(df['date1'], format='%m/%d/%Y', errors='coerce').dropna()
df
date1 nb_months
0 2019-12-01 11
1 2019-12-01 11
2 2019-12-01 12
我想将 nb_months 添加到 date1 列。我确实尝试了下面的代码,但输出不是我的 expecting.The 下面的代码给了我 1 个先前日期作为输出(例如,对于第一行:date3 应该是 2019-12-01 + 11 个月 = 2020-11 -01 而我得到的是 2020-10-31。
df['date3'] = df.apply(lambda x: x['date1'] + pd.offsets.MonthEnd(x['nb_months']), axis=1)
df
date1 nb_months date3
0 2019-12-01 11 2020-10-31
1 2019-12-01 11 2020-10-31
2 2019-12-01 12 2020-11-30
我的预期输出:
date1 nb_months date3
0 2019-12-01 11 2020-11-01
1 2019-12-01 11 2020-11-01
2 2019-12-01 12 2020-12-01
我认为您需要 MonthBegin
,而不是 MonthEnd
,以便在每个月的第一天获得新日期。这是您的示例的略微修改版本:
# set up the data frame
df = pd.DataFrame(
{'date1': ['12/1/2019', '12/2/2019', '12/2/2019', '12/3/2019', '12/31/2019'],
'nb_months': [0, 1, 2, 3, 0]})
df['date1'] = pd.to_datetime(
df['date1'], format='%m/%d/%Y', errors='coerce').dropna()
# apply the offsets
df['date3'] = df.apply(
lambda x: x['date1'] + pd.offsets.MonthBegin(x['nb_months']), axis=1)
print(df)
date1 nb_months date3
0 2019-12-01 0 2019-12-01
1 2019-12-02 1 2020-01-01
2 2019-12-02 2 2020-02-01
3 2019-12-03 3 2020-03-01
4 2019-12-31 0 2020-01-01
使用pd.DateOffset
df.apply(lambda x: x['date1'] + pd.DateOffset(months=x['nb_months']), axis=1)
Out[41]:
0 2020-11-01
1 2020-11-01
2 2020-12-01
dtype: datetime64[ns]
我有一个 pandas 数据框如下:
import pandas as pd
df = pd.DataFrame({'date1':['12/1/2019','12/1/2019','12/1/2019'], 'nb_months':[11,11,12]})
df['date1'] = pd.to_datetime(df['date1'], format='%m/%d/%Y', errors='coerce').dropna()
df
date1 nb_months
0 2019-12-01 11
1 2019-12-01 11
2 2019-12-01 12
我想将 nb_months 添加到 date1 列。我确实尝试了下面的代码,但输出不是我的 expecting.The 下面的代码给了我 1 个先前日期作为输出(例如,对于第一行:date3 应该是 2019-12-01 + 11 个月 = 2020-11 -01 而我得到的是 2020-10-31。
df['date3'] = df.apply(lambda x: x['date1'] + pd.offsets.MonthEnd(x['nb_months']), axis=1)
df
date1 nb_months date3
0 2019-12-01 11 2020-10-31
1 2019-12-01 11 2020-10-31
2 2019-12-01 12 2020-11-30
我的预期输出:
date1 nb_months date3
0 2019-12-01 11 2020-11-01
1 2019-12-01 11 2020-11-01
2 2019-12-01 12 2020-12-01
我认为您需要 MonthBegin
,而不是 MonthEnd
,以便在每个月的第一天获得新日期。这是您的示例的略微修改版本:
# set up the data frame
df = pd.DataFrame(
{'date1': ['12/1/2019', '12/2/2019', '12/2/2019', '12/3/2019', '12/31/2019'],
'nb_months': [0, 1, 2, 3, 0]})
df['date1'] = pd.to_datetime(
df['date1'], format='%m/%d/%Y', errors='coerce').dropna()
# apply the offsets
df['date3'] = df.apply(
lambda x: x['date1'] + pd.offsets.MonthBegin(x['nb_months']), axis=1)
print(df)
date1 nb_months date3
0 2019-12-01 0 2019-12-01
1 2019-12-02 1 2020-01-01
2 2019-12-02 2 2020-02-01
3 2019-12-03 3 2020-03-01
4 2019-12-31 0 2020-01-01
使用pd.DateOffset
df.apply(lambda x: x['date1'] + pd.DateOffset(months=x['nb_months']), axis=1)
Out[41]:
0 2020-11-01
1 2020-11-01
2 2020-12-01
dtype: datetime64[ns]