【问题标题】:Pandas read date from CSV and groupby total business days per month熊猫从 CSV 和 groupby 每月总工作日读取日期
【发布时间】:2020-02-08 12:38:48
【问题描述】:

data.CSV

ID Activity Month   Activity Date

0   04/2019     04-01-2019

1   05/2019     05-13-2019

2   05/2019     05-25-2019

3   06/2019     06-10-2019

4   06/2019     06-19-2019

5   07/2019     07-15-2019

6   07/2019     07-18-2019

7   07/2019     07-29-2019

8   08/2019     06-03-2019

9   08/2019     06-15-2019

10  08/2019     06-20-2019

我的计划

读取 csv:

df = pd.read_csv('data.CSV')

转换为日期时间:

df['活动日期'] = pd.to_datetime(df['活动日期'], dayfirst=True)

按活动月份列分组:

grouped = df.groupby(['活动月份'])['活动日期'].count()

打印(分组)

Activity Month
04/2019    15532
05/2019    13924
06/2019    12822
07/2019    14067
08/2019    10939
Name: Activity Date, dtype: int64

对日期进行分组时,执行工作日计算:

这部分我不知道该怎么做。已经迷路了

我用来计算工作日的代码

import calendar
import datetime

x = datetime.date(2019, 4, 1)
cal = calendar.Calendar()
working_days = len([x for x in cal.itermonthdays2(x.year, x.month) if x[0] !=0 and x[1] < 5])
print ("Total business days for month (" + str(x.month) +  ") is " + str(working_days) + " days")

我想要的输出

Total business days for month (4) is 22 days
Total business days for month (5) is 23 days
Total business days for month (6) is 20 days
Total business days for month (7) is 23 days
Total business days for month (8) is 22 days

【问题讨论】:

  • 评论不要忘记这个,我在我的手机上,会在几个小时内检查并给你答案。我最近也在使用这个库!
  • 感谢@CeliusStingher 的努力

标签: python pandas datetime pandas-groupby


【解决方案1】:

我并不完全清楚这里的问题陈述,但是如果您想计算每个 Activity Month 的工作日数,您可以将计算包装在一个方法中,然后将该方法应用于您的 Activity Month列(lambda 表达式基本上是针对指定列的每一行的 for 循环操作)。

grouped = df.groupby(['Activity Month'])['Activity Date'].count().reset_index()

def get_business_days(x):
    x = datetime.date(int(x.split('/')[1]), int(x.split('/')[0]), 1)
    cal = calendar.Calendar()
    working_days = len([x for x in cal.itermonthdays2(x.year, x.month) if x[0] !=0 and x[1] < 5])
    return ("Total business days for month (" + str(x.month) +  ") is " + str(working_days) + " days")

grouped['Activity Month'].apply(get_business_days)

输出是具有您的文本输出的系列。

0    Total business days for month (4) is 22 days
1    Total business days for month (5) is 23 days
2    Total business days for month (6) is 20 days
3    Total business days for month (7) is 23 days
4    Total business days for month (8) is 22 days

但是,在每个单元格中存储重复信息是个坏主意。最好简单地返回 working_days 而不是将其嵌入字符串中。

【讨论】:

  • 我想这就是我想要的。仅用于学习目的,暂时还可以。还是谢谢!
  • 无论如何,我可以知道为什么我们需要添加“.reset_index()”吗?我试图删除它,但代码不起作用
  • 当您运行groupby 操作时,它会将Activity Month 作为DataFrame 的索引。 reset_index() 将当前索引换成行号,并将原始索引作为新列放入(仅当您不传递 drop=True 时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2021-05-09
相关资源
最近更新 更多