根据年和月的列,创建一个具有每月第7个工作日的新列



我有一个数据帧,它有两列,即另一个变量的年份和月份,为了简单起见,我省略了这两列。它看起来像这样:

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

相关内容

最新更新