Pandas中提取Datetime时间进行时段筛选统计购买量失败问题
问题:无法正确筛选datetime字段中的上午/下午购买记录
我明白你遇到的问题了——你已经把purchase_time转成了datetime类型,但直接用df['purchase_time'] < '12:00:00'筛选上午记录时,返回的还是全部数据。这是因为pandas会把字符串'12:00:00'自动解析成「当前日期的中午12点」,而你的数据里的时间都是2007年的,所有旧日期的datetime自然都小于这个新的中午时间,所以筛选条件相当于永远为True。
下面给你几种可行的解决方案,从基础筛选到直接统计总购买量都有:
1. 基础筛选:提取小时判断时段
最简单的方式是利用datetime字段的dt.hour属性,直接判断小时数是否小于12:
# 筛选上午(小时 <12)的记录 morning_purchases = df[df['purchase_time'].dt.hour < 12] # 筛选下午(小时 >=12)的记录 afternoon_purchases = df[df['purchase_time'].dt.hour >= 12]
2. 更精确的时间比较
如果需要精确到时分秒的比较(比如区分12:00:00整的订单),可以提取时间部分和datetime.time对象比较:
import datetime # 筛选上午(时间早于12:00:00)的记录 morning_purchases = df[df['purchase_time'].dt.time < datetime.time(12, 0, 0)]
3. 一步到位:统计各时段总购买量
既然你的最终目标是统计上午和下午的总购买量,不需要单独保留筛选后的数据集的话,可以直接用分组统计:
# 先给每条记录标记时段 df['period'] = df['purchase_time'].dt.hour.apply(lambda x: '上午' if x < 12 else '下午') # 按时段分组求和 period_total = df.groupby('period')['quantity'].sum() # 输出结果 print(period_total)
针对你的示例数据,运行后会得到:
上午 10 下午 13 dtype: int64
内容的提问来源于stack exchange,提问作者Homesand
相关产品推荐
相关产品推荐

