Pandas dataframe - 填充下个月的最后一个

Pandas dataframe - fillna with last of next month

我盯着这个看的时间太长了,我觉得我疯了,真的不应该像我做的那么复杂。

我有一个 df:

Date1 Date2
2022-04-01 2022-06-17
2022-04-15 2022-04-15
2022-03-03 NaT
2022-04-22 NaT
2022-05-06 2022-06-06

我想填补 'Date2' 中的空白,如果它们存在,它会保留 'Date2' 的值,但如果 'Date2' 是 NaT,那么我希望它是最后一个日期从 'Date1'.

开始的下个月

在上面的示例中,2 个 NaT 字段将变为:

Date1 Date2
2022-03-03 2022-04-30
2022-04-22 2022-05-31

我知道我必须使用 .fillna,我最接近的是:

df['Date2'] = (df['Date2'].fillna((df['Date1'] + pd.DateOffset(months=1)).replace)).to_numpy().astype('datetime64[M]')

这是 returns 这个月的第一天。但是,它 returns 所有行(不仅仅是 NaT 行)的第一天,并且返回第一天而不是最后一天。

我很确定我的括号搞砸了,我已经尝试了很多不同的组合 - timedelta 和类似的。

我在这里做错了什么? TIA!

根据提供的示例,可以用两种方式解释您的问题。

下一行日期 1 的月底(now 似乎不是你想要的)

您需要使用 pd.offses.MonthEndshift

df['Date2'] = (df['Date2']
               .fillna(df['Date1'].add(pd.offsets.MonthEnd())
                                  .shift(-1))
               )

下个月底(同一行)

如果你想要下月末同一行:

df['Date2'] = (df['Date2']
               .fillna(df['Date1'].add(pd.offsets.MonthEnd(2)))
               )

输出:

       Date1      Date2
0 2022-04-01 2022-06-17
1 2022-04-15 2022-04-15
2 2022-03-03 2022-04-30
3 2022-04-22 2022-05-31
4 2022-05-06 2022-06-06

使用MonthEndloc:

from pandas.tseries.offsets import MonthEnd
>>> df.loc[df['Date2'].isnull(), 'Date2'] = df['Date1'] + pd.DateOffset(months=1) + MonthEnd(1)

使用偏移量为 2 的 MonthEnd(当前月份和下个月):

df['Date2'] = df['Date2'].fillna(df['Date1'].add(pd.offsets.MonthEnd(2)))
print(df)

# Output
       Date1      Date2
0 2022-04-01 2022-06-17
1 2022-04-15 2022-04-15
2 2022-03-03 2022-04-30
3 2022-04-22 2022-05-31
4 2022-05-06 2022-06-06