【问题标题】:Workdays for each month in list in pythonpython列表中每个月的工作日
【发布时间】:2020-09-15 17:36:45
【问题描述】:

python新手在这里。 我正在尝试创建一个 df,其中 1 列是一个月 'YYYY-MM',我在下面的 dict 中创建了它(将不胜感激使用代码生成此内容的提示)。 我一直在尝试使用 month_list 填充工作日列。

import pandas as pd
df = pd.DataFrame({'month_list':['2019-01', '2019-02', '2019-03', '2019-04']})
df['weekdays'] = ''

我试过这段代码,但这仅适用于第一行。 (我明白为什么会这样,我只是不知道正确完成每一行的最佳方法)

df.weekdays = np.busday_count(month_list[0], month_list[0+1])
df

【问题讨论】:

  • 根据示例输入数据框,您的预期输出是什么?
  • 我想看看每个月的工作日数。例如,第一个月应该是 23。

标签: python pandas dataframe weekday


【解决方案1】:

通过Series.dt.strftime将值转换为日期时间和字符串,然后添加一个月并传递给np.busday_count

df = pd.DataFrame({'month_list':['2019-01', '2019-02', '2019-03', '2019-04']})

month_list = pd.to_datetime(df['month_list'])
a = month_list.dt.strftime('%Y-%m-%d')
b = (month_list + pd.offsets.DateOffset(months=1)).dt.strftime('%Y-%m-%d')

df['weekdays'] = np.busday_count(a, b)

print (df)
  month_list  weekdays
0    2019-01        23
1    2019-02        20
2    2019-03        21
3    2019-04        22

只有 numpy 解决方案:

month_list = pd.to_datetime(df['month_list'])

a = month_list.to_numpy().astype('datetime64[M]')
b = a + np.array([1], dtype='timedelta64[M]') 

df['weekdays'] = np.busday_count(a, b)
print (df)
  month_list  weekdays
0    2019-01        23
1    2019-02        20
2    2019-03        21
3    2019-04        22

【讨论】:

    【解决方案2】:
    from pandas.tseries.offsets import MonthEnd
    df = pd.DataFrame({'month_list': pd.date_range('2019-01', '2019-12', freq='MS')})
    
    df['weekdays'] = np.busday_count(df.month_list.values.astype('datetime64[D]'), (df.month_list + MonthEnd(0)).values.astype('datetime64[D]')) + 1
    

    结果:

       month_list  weekdays
    0  2019-01-01        23
    1  2019-02-01        20
    2  2019-03-01        22
    3  2019-04-01        22
    4  2019-05-01        23
    5  2019-06-01        21
    6  2019-07-01        23
    7  2019-08-01        23
    8  2019-09-01        21
    9  2019-10-01        23
    10 2019-11-01        22
    11 2019-12-01        22
    

    【讨论】:

    • 感谢 Stef 和 jezrael,这两种解决方案都非常有帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2013-04-08
    • 2020-08-12
    • 2015-12-13
    相关资源
    最近更新 更多