Pandas 在计算相应的最后一个工作日时更改月份

在下面的pandas数据框示例中,MyDate由该月的第一天和该月的最后一个 工作日组成。数据集将始终运行到 1st (current month - 1)。


我想将 MyDate 动态增加一个月。然而,这样做后,最后一个工作日就不再是正确的了。因此,我还想根据更新的月份计算最后一个工作日。


输入:


MyDate       MyValue 

31/Mar/2020  0

01/Apr/2020  a

30/Apr/2020  b

01/May/2020  c

29/May/2020  d <<< note 29 May - last workday of month

01/Jun/2020  e

30/Jun/2020  f

01/Jul/2020  g

31/Jul/2020  h

01/Aug/2020  i

期望的输出:


MyDate       MyValue 

30/Apr/2020  0

01/May/2020  a

29/May/2020  b <<< note 29 May - last workday of month

01/Jun/2020  c

30/Jun/2020  d 

01/Jul/2020  e

31/Jul/2020  f

01/Aug/2020  g

31/Aug/2020  h

01/Sep/2020  i

我将问题分为两部分:

  1. 更改monthmonth+1- 使用relativedelta

  2. 获取更改月份的最后一个工作日 - 使用pd.offsets.BMonthEnd()

,但不知怎的,尽管我尝试了在 stackoverflow 上发布的类似解决方案,但我还是陷入了#2。

这是我的代码:

import pandas as pd

from dateutil.relativedelta import relativedelta


...

# this solves part #1

df['MyDate']=df['MyDate'].dt.date + relativedelta(months=+1)


# attempt at solving part 2

df['MyDate']=pd.to_datetime(df['MyDate'])


mask = df['MyDate'].dt.day > 1

df.loc[mask, 'MyDate'] = df['MyDate'] + pd.offsets.BMonthEnd(1)

最后一行是我被困住的地方;显然它不会产生我认为会产生的结果......


任何解决此问题的帮助,或解决整个问题的不同“熊猫式”方法,将不胜感激。


BIG阳
浏览 70回答 1
1回答

芜湖不芜

您可以创建一个布尔掩码来标识列中的业务月末日期MyDate(业务月末日期返回True,其他返回False)。使用此掩码分别添加 1 个月初和 1 个营业月末m = df.MyDate == (df.MyDate + pd.offsets.BMonthEnd(0))df.loc[m, 'MyDate']&nbsp; = df.loc[m, 'MyDate'] +&nbsp; pd.offsets.BMonthEnd(1)df.loc[~m, 'MyDate'] = df.loc[~m, 'MyDate'] +&nbsp; pd.offsets.MonthBegin(1)print(df)Output:&nbsp; &nbsp; &nbsp; MyDate MyValue0 2020-04-30&nbsp; &nbsp; &nbsp; &nbsp;01 2020-05-01&nbsp; &nbsp; &nbsp; &nbsp;a2 2020-05-29&nbsp; &nbsp; &nbsp; &nbsp;b3 2020-06-01&nbsp; &nbsp; &nbsp; &nbsp;c4 2020-06-30&nbsp; &nbsp; &nbsp; &nbsp;d5 2020-07-01&nbsp; &nbsp; &nbsp; &nbsp;e6 2020-07-31&nbsp; &nbsp; &nbsp; &nbsp;f7 2020-08-01&nbsp; &nbsp; &nbsp; &nbsp;g8 2020-08-31&nbsp; &nbsp; &nbsp; &nbsp;h9 2020-09-01&nbsp; &nbsp; &nbsp; &nbsp;i注意:我假设你的MyDate专栏已经在dtype: datetime64[ns]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python