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.MonthEnd
和 shift
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
使用MonthEnd
和loc
:
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
我盯着这个看的时间太长了,我觉得我疯了,真的不应该像我做的那么复杂。
我有一个 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.MonthEnd
和 shift
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
使用MonthEnd
和loc
:
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