[英]Pandas change month while calculating the corresponding last business day
在下面的pandas
数据框示例中, MyDate
由当月的第一天和当月的最后一个工作日组成。 数据集将始终运行到(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)
最后一行是我被卡住的地方; 显然它不会产生我认为会的结果......
任何解决此问题的帮助,或解决整个问题的不同“熊猫式”方法,将不胜感激。
您可以创建一个布尔掩码来标识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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.