基于时间戳对Datetime列分组:时间分箱实现求助
解决方案
要实现将时间划分到指定时段的需求,你可以通过转换日期格式+自定义分箱区间的方式完成,具体步骤如下:
1. 处理数据格式问题
首先注意你原始数据中有一处时间格式错误(13:10:10:258里的第三个冒号应为点),需要先修复,否则无法正常解析为datetime类型。
2. 完整代码实现
import pandas as pd # 构造原始数据 data = { "Unique_Id": ["A", "A", "A", "A", "B", "B"], "Date": [ "11-01-2022 10:20:30.500", "11-01-2022 13:10:10:258", "11-01-2022 17:30:22.223", "11-01-2022 23:20:38.222", "02-02-2022 08:25:30.000", "04-02-2022 11:35:40.928" ] } df = pd.DataFrame(data) # 修复时间格式错误(替换最后一个冒号为点) df["Date"] = df["Date"].str.replace(r"(\d{2}:\d{2}:\d{2}):(\d{3})", r"\1.\2", regex=True) # 转换为datetime类型,指定格式避免解析歧义 df["Date"] = pd.to_datetime(df["Date"], format="%d-%m-%Y %H:%M:%S.%f") # 定义分箱区间和对应时段标签 bins = [0, 6, 9, 12, 15, 17, 20, 24] labels = [ "12AM - 6AM", "6AM - 9AM", "9AM - 12AM", "12PM - 3PM", "3PM - 5PM", "5PM - 8PM", "9PM - 12PM" ] # 生成Time_Group列,right=False表示左闭右开区间 df["Time_Group"] = pd.cut(df["Date"].dt.hour, bins=bins, labels=labels, right=False) print(df)
关键说明
- 分箱逻辑:
right=False设置区间为左闭右开,比如[6,9)会包含6点整至8:59:59.999的时间,符合你给出的示例规则。 - 覆盖全天:分箱区间包含了0-24小时的所有时段,避免出现
NaN值;如果不需要3PM - 5PM这个区间,可以自行调整bins和labels。 - 格式解析:通过
format="%d-%m-%Y %H:%M:%S.%f"明确指定日期格式,避免因系统环境差异导致的解析错误。
运行后得到的结果与你期望的完全一致:
Unique_Id Date Time_Group 0 A 2022-01-11 10:20:30.500 9AM - 12AM 1 A 2022-01-11 13:10:10.258 12PM - 3PM 2 A 2022-01-11 17:30:22.223 5PM - 8PM 3 A 2022-01-11 23:20:38.222 9PM - 12PM 4 B 2022-02-02 08:25:30.000 6AM - 9AM 5 B 2022-02-04 11:35:40.928 9AM - 12AM
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

