我有一个数据帧,它有两列,即另一个变量的年份和月份,为了简单起见,我省略了这两列。它看起来像这样:
YearOfSRC MonthNumberOfSRC
0 2022 3
1 2022 4
2 2022 5
3 2022 6
4 2021 4
... ... ...
20528 2022 1
20529 2022 2
20530 2022 3
20531 2022 4
20532 2022 5
我想创建一个名为PredictionDate
的新列,该列以YYYY-MM-DD
的格式包含当年当月的第7个工作日的日期。看起来我可以做这样的事情,但我不确定如何在一个数据帧中实现,其中月份和年份分别在不同的列中。我确信它将涉及apply
和/或groupby
,但同样不确定如何处理。我是否需要首先创建一个包含月份和年份的辅助列,然后使用它来生成所需的输出列?
编辑给出的解决方案确实有效。然而,我意识到,有些月份的第7个工作日会被当月第一周的假期所抵消,比如新年和7月4日。因此,我发布了一个新问题,寻求如何将这一事实纳入这里的解决方案。
如果我理解正确,您可以使用pandas.to_datetime
转换为日期时间,然后使用pandas.offsets.BusinessDay
获得您的工作日:
df['PredictionDate'] = (pd
.to_datetime(df[['YearOfSRC', 'MonthNumberOfSRC']]
.set_axis(['year' ,'month'], axis=1)
.assign(day=1)
)
.sub(pd.offsets.BusinessDay(1))
.add(pd.offsets.BusinessDay(7))
)
输出:
YearOfSRC MonthNumberOfSRC PredictionDate
0 2022 3 2022-03-09
1 2022 4 2022-04-11
2 2022 5 2022-05-10
3 2022 6 2022-06-09
4 2021 4 2021-04-09
20528 2022 1 2022-01-11
20529 2022 2 2022-02-09
20530 2022 3 2022-03-09
20531 2022 4 2022-04-11
20532 2022 5 2022-05-10
如果我理解正确,您可以将这两列转换为日期时间格式并添加pd.tseries.offsets.BusinessDay(n = 7)
:
df["PredictionDate"] = (
pd.to_datetime(
df["YearOfSRC"].astype(str)
+ "-"
+ df["MonthNumberOfSRC"].astype(str)
+ "-01",
dayfirst=False,
)
+ pd.tseries.offsets.BusinessDay(n=7)
)
print(df)
打印:
YearOfSRC MonthNumberOfSRC PredictionDate
0 2022 3 2022-03-10
1 2022 4 2022-04-12
2 2022 5 2022-05-10
3 2022 6 2022-06-10
4 2021 4 2021-04-12