【问题标题】:Get column with cumulative business day for each month from pandas datetimeindex从 pandas datetimeindex 获取每个月的累积工作日列
【发布时间】:2020-08-12 11:29:22
【问题描述】:

我试图获得与df.index.day 类似的输出,但数字对应于工作日。所以对于 2020-04-06,我想要 4 而不是 6。

感谢您的帮助。

解决方案:

for i in range(len(df_21)):
    if ((i == 0) | (df_21.month[i-1] != df_21.month[i])):
        df_21.day[i] = 1
    elif ((df_21.day[i] - df_21.day[i-1]) != 1):
        df_21.day[i] = df_21.day[i-1] + 1

【问题讨论】:

  • 使用weekday怎么样?
  • 我想要一个工作日的每月运行计数。我知道我可以一起破解它,只是想看看是否有简单的方法。
  • 所以澄清一下:您想要一列显示每一行的累计工作日吗?您的日期时间索引是否还包括非工作日?如果是这样,你想如何处理这些?
  • 今天是 6 月 4 日还是 4 月 6 日?如果是 6 月 4 日,那你为什么会收到 6 返回? 6 月 4 日是星期四
  • @Erfan:4 月 6 日是 4 月的第 4 个工作日,如果您将截至该日期(包括该日期)的所有工作日相加

标签: python pandas datetime python-datetime datetimeindex


【解决方案1】:

假设您有一个如下所示的datetime 列,我们可以使用pandas.bdate_range 来检查哪些日期是工作日,然后使用Series.cumsum 来获取累计和:

df = pd.DataFrame({'date': pd.date_range('2020-04-01', '2020-04-07')})

        date
0 2020-04-01
1 2020-04-02
2 2020-04-03
3 2020-04-04
4 2020-04-05
5 2020-04-06
6 2020-04-07

解决方案

# get date range of business days
business_days = pd.bdate_range(df['date'].min(), df['date'].max())

# check which dates are business days
bdays_bool = df['date'].isin(business_days)

# get the cumulative sums of all business days per month
df['nth_business_day'] = bdays_bool.groupby([df['date'].dt.year, df['date'].dt.month]).cumsum()

        date  nth_business_day
0 2020-03-29               0.0
1 2020-03-30               1.0
2 2020-03-31               2.0
3 2020-04-01               1.0
4 2020-04-02               2.0
5 2020-04-03               3.0
6 2020-04-04               3.0
7 2020-04-05               3.0
8 2020-04-06               4.0
9 2020-04-07               5.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2020-09-15
    • 2015-10-28
    相关资源
    最近更新 更多