在下面的pandas数据框示例中,MyDate由该月的第一天和该月的最后一个 工作日组成。数据集将始终运行到 1st (current month - 1)。我想将 MyDate 动态增加一个月。然而,这样做后,最后一个工作日就不再是正确的了。因此,我还想根据更新的月份计算最后一个工作日。输入:MyDate MyValue 31/Mar/2020 001/Apr/2020 a30/Apr/2020 b01/May/2020 c29/May/2020 d <<< note 29 May - last workday of month01/Jun/2020 e30/Jun/2020 f01/Jul/2020 g31/Jul/2020 h01/Aug/2020 i期望的输出:MyDate MyValue 30/Apr/2020 001/May/2020 a29/May/2020 b <<< note 29 May - last workday of month01/Jun/2020 c30/Jun/2020 d 01/Jul/2020 e31/Jul/2020 f01/Aug/2020 g31/Aug/2020 h01/Sep/2020 i我将问题分为两部分:更改month为month+1- 使用relativedelta获取更改月份的最后一个工作日 - 使用pd.offsets.BMonthEnd(),但不知怎的,尽管我尝试了在 stackoverflow 上发布的类似解决方案,但我还是陷入了#2。这是我的代码:import pandas as pdfrom dateutil.relativedelta import relativedelta...# this solves part #1df['MyDate']=df['MyDate'].dt.date + relativedelta(months=+1)# attempt at solving part 2df['MyDate']=pd.to_datetime(df['MyDate'])mask = df['MyDate'].dt.day > 1df.loc[mask, 'MyDate'] = df['MyDate'] + pd.offsets.BMonthEnd(1)最后一行是我被困住的地方;显然它不会产生我认为会产生的结果......任何解决此问题的帮助,或解决整个问题的不同“熊猫式”方法,将不胜感激。
1 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
您可以创建一个布尔掩码来标识列中的业务月末日期MyDate(业务月末日期返回True,其他返回False)。使用此掩码分别添加 1 个月初和 1 个营业月末
m = df.MyDate == (df.MyDate + pd.offsets.BMonthEnd(0))
df.loc[m, 'MyDate'] = df.loc[m, 'MyDate'] + pd.offsets.BMonthEnd(1)
df.loc[~m, 'MyDate'] = df.loc[~m, 'MyDate'] + pd.offsets.MonthBegin(1)
print(df)
Output:
MyDate MyValue
0 2020-04-30 0
1 2020-05-01 a
2 2020-05-29 b
3 2020-06-01 c
4 2020-06-30 d
5 2020-07-01 e
6 2020-07-31 f
7 2020-08-01 g
8 2020-08-31 h
9 2020-09-01 i
注意:我假设你的MyDate专栏已经在dtype: datetime64[ns]
添加回答
举报
0/150
提交
取消