按月/年计算独特天数

时间:2018-02-28 19:50:45

标签: python pandas dataframe group-by

早上好,

我正在研究一个问题,我希望有一个非常简单的解决方案,但我似乎无法以最有用的格式进行格式化。

在我的分析工作中,我们正在考虑将全时班次添加到远程位置并查看这是否有效或与Per Diem工作保持一致,我们需要分析建议的班次(一周中的小时和天) )他们可以拥有多少次调度,更重要的是,历史数据有多少天没有调度。

我的主要数据只是发送日期,格式化为数千行

MM/DD/YYYY HH:MM:SS

为了让它更容易使用,我开始使用以下代码:

import pandas as pd

shift_df = pd.read_excel('dfname.xlsx')
shift_df['Year'] = shift_df['Dispatch'].dt.year
shift_df['Month'] = shift_df['Dispatch'].dt.month
shift_df['WeekDay'] = shift_df['Dispatch'].dt.weekday

然后我尝试使用所需的输出:

进行分组
Year   | Month  | Unique Days
2017       1        13
2017       2        16
2017       3        19

使用公式:

shift_df[disp_time].groupby([(shift_df[disp_time].dt.year),(shift_df[disp_time].dt.month)]).count()

它的形式接近我想要的:

Year |  Month  | TOTAL RECORDS
2017     1         29

问题是,我们经常在一天内进行多次调度,以便计算当天的所有记录。我尝试了一些.agg(“total”:pd.Seriesl.nunique()),但这给了我独特的月份数字。我可以通过添加[shift_df ['Day']来生成它并用一个简单的组来计算每月所代表的总天数,但是这会产生更多我希望的工作。

我使用的是正确的功能,还是应该尝试使用枢轴功能?

感谢您的帮助,

Andy M。

------------ EDITED澄清---------------

为每个请求添加一个简短的编辑我的仓库尽可能多的字段,但我过滤了我的DF并做了一些数据清理以包含一些基本项目,因为这是一个纯粹的汇总计数,同时我们检查转移的可能性和历史上看起来会是什么等。

我的DF我正在与我合作我缩小了发货日期 - 然后我在我的示例代码中尽快分解了我的发货日期:

---- ---- shift_DF

Dispatch Date / Time    | Dispatch Year    | Dispatch Month   | Dispatch Day
 1/1/2017 05:32:53          2017                  1                  1
 1/7/2017 15:32:53          2017                  1                  7
 1/1/2017 05:32:53          2017                  1                  1
 1/3/2017 03:32:53          2017                  1                  3
 1/1/2017 05:32:53          2017                  1                  1

我想要的输出看起来像

dispatch year | dispatch month | unique days
2017             1                  3

问题是我的输出现在看起来像

dispatch year | dispatch month | unique days
2017             1                  5

它统计了与月份匹配的所有5条记录,实际上我们在1月1日有3次发送,我只想计算1月1日。

这些数据会在多年/数月/天内复制,但目标是在每年的等级中总结 - 月 - 每次都是独特的日子。

2 个答案:

答案 0 :(得分:2)

假设您有一个名为Date的列:

s = pd.to_datetime(s, errors='coerce')
s

0   2017-01-01 05:32:53
1   2017-01-07 15:32:53
2   2017-01-01 05:32:53
3   2017-01-03 03:32:53
4   2017-01-01 05:32:53
Name: Date, dtype: datetime64[ns]

你真的不需要任何额外的列。只需使用groupby + nunique

s.groupby([s.dt.year, s.dt.month])\
 .nunique()\
 .rename_axis(['year', 'month'])\
 .reset_index(name='unique days')

   year  month  unique days
0  2017      1            3

答案 1 :(得分:0)

count = df.groupby([(df.index.year),(df.index.month)]).count()

将日期设置为索引并在其上方运行