使用pandas和datetime在Jupyter中统计从未产生销量的时段(小时/分钟)
解决方案
前置修正:保留原始订单级时间数据
你之前的操作里把存储单条订单时间的time_df直接覆盖为了按月聚合的统计结果,后续无法基于单条订单的原始时间做时段统计,需要先保留原始数据:
import pandas as pd # 原始导入&清洗逻辑 df = pd.read_excel('Audit Period.xlsx') # 保留非空的订单时间,不提前做聚合 raw_time_df = df[df["Order Date Time"].notnull()][["Order Date Time"]].reset_index(drop=True) # 转换为datetime格式 raw_time_df["Order Date Time"] = pd.to_datetime(raw_time_df["Order Date Time"])
需求1:统计所有日期相同时段的总销量,找到销量最高的时段
用datetime的dt属性提取时段维度分组,不要用resample(resample是按连续时间序列拆分,会把不同日期的相同时段分开统计):
# 统计单小时维度的全日期总销量 raw_time_df['hour'] = raw_time_df['Order Date Time'].dt.hour hourly_total = raw_time_df.groupby('hour').size().reset_index(name='sales_count') # 输出销量最高的小时 top_sales_hour = hourly_total.sort_values('sales_count', ascending=False).iloc[0] print(f"销量最高的时段:{top_sales_hour['hour']}点,总销量{top_sales_hour['sales_count']}") # 如果需要统计2小时粒度的时段,用以下代码 raw_time_df['2h_period'] = (raw_time_df['hour'] // 2) * 2 two_hour_total = raw_time_df.groupby('2h_period').size().reset_index(name='sales_count')
需求2:筛选从未产生销量的分钟级时间段
先生成统计范围内的完整分钟时间序列,再和有销量的分钟做差集即可:
# 确定统计的时间边界:取所有订单的最早、最晚时间 start_time = raw_time_df['Order Date Time'].min().floor('min') end_time = raw_time_df['Order Date Time'].max().ceil('min') # 生成该时间范围内的完整分钟级时间序列 full_minute_range = pd.date_range(start=start_time, end=end_time, freq='T') # 提取所有产生过销量的分钟(把秒部分抹掉统一精度) sales_minutes = raw_time_df['Order Date Time'].dt.floor('min').unique() # 取差集得到无销量的分钟 no_sales_minutes = full_minute_range[~full_minute_range.isin(sales_minutes)] # 可以转为DataFrame导出 no_sales_df = pd.DataFrame(no_sales_minutes, columns=['no_sales_minute']) no_sales_df.to_excel('no_sales_minutes.xlsx', index=False)
内容的提问来源于stack exchange,提问作者Andrew Leahey
相关产品推荐
相关产品推荐

