You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于时间戳对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:46:57