在下面的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
我将问题分为两部分:
更改month
为month+1
- 使用relativedelta
获取更改月份的最后一个工作日 - 使用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)
最后一行是我被困住的地方;显然它不会产生我认为会产生的结果......
任何解决此问题的帮助,或解决整个问题的不同“熊猫式”方法,将不胜感激。
芜湖不芜
相关分类