繁体   English   中英

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

[英]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

我把问题分成两部分:

  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)

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

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

您可以创建一个布尔掩码来标识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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM