早上好,
我正在研究一个问题,我希望有一个非常简单的解决方案,但我似乎无法以最有用的格式进行格式化。
在我的分析工作中,我们正在考虑将全时班次添加到远程位置并查看这是否有效或与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日。
这些数据会在多年/数月/天内复制,但目标是在每年的等级中总结 - 月 - 每次都是独特的日子。
答案 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()
将日期设置为索引并在其上方运行