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

如何在Python中对DataFrame时间戳分箱并分配对应标签?

别担心,作为Python新手遇到这类时间分箱问题很正常,我来一步步帮你实现想要的效果!

步骤1:准备数据与导入依赖库

首先确保你导入了必要的库,同时构造好你的示例DataFrame(如果还没完成的话):

import pandas as pd
import numpy as np

# 你的示例数据
data = {
    'ID': ['A', 'B', 'C', 'D'],
    'Time': ['2:44PM', '3:23AM', '5:00PM', '12:00AM']
}
df = pd.DataFrame(data)
步骤2:将时间字符串转换为可处理的datetime类型

原始的Time列是字符串格式,我们需要先把它转换成pandas能识别的datetime格式,这样才能提取出小时信息用于分箱:

# 转换Time列,%I对应12小时制的小时,%p对应AM/PM标识
df['Time'] = pd.to_datetime(df['Time'], format='%I:%M%p')
# 提取小时数(范围0-23)
df['Hour'] = df['Time'].dt.hour
步骤3:按规则分箱生成T_flag列

根据你的需求,特别注意12:00AM(对应hour=0)需要被分到标签3,这里推荐用np.select来实现,这种方式逻辑清晰,对新手更友好:

# 定义每个标签对应的判断条件
conditions = [
    # 12:00AM(不含)到6:00AM(不含)→ 标签0
    (df['Hour'] > 0) & (df['Hour'] < 6),
    # 6:00AM(含)到12:00PM(不含)→ 标签1
    (df['Hour'] >= 6) & (df['Hour'] < 12),
    # 12:00PM(含)到6:00PM(不含)→ 标签2
    (df['Hour'] >= 12) & (df['Hour'] < 18),
    # 6:00PM(含)到12:00AM(含)→ 标签3
    (df['Hour'] >= 18) | (df['Hour'] == 0)
]

# 对应条件的标签列表
choices = [0, 1, 2, 3]

# 生成T_flag列
df['T_flag'] = np.select(conditions, choices)

如果你坚持想用pd.cut,需要调整分箱边界来适配12:00AM的特殊情况:

# 自定义分箱边界,把0单独纳入最后一个区间
bins = [0, 6, 12, 18, 24, 0]
labels = [0, 1, 2, 3, 3]

# 生成T_flag,ordered=False允许非连续的分箱边界
df['T_flag'] = pd.cut(df['Hour'], bins=bins, labels=labels, include_lowest=True, ordered=False)
# 转换为数值类型
df['T_flag'] = df['T_flag'].astype(int)
步骤4:查看最终结果

最后你可以只保留需要的ID和T_flag列:

print(df[['ID', 'T_flag']])

输出结果完全符合你的期望:

ID  T_flag
0  A       2
1  B       0
2  C       2
3  D       3

内容的提问来源于stack exchange,提问作者user9821361

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:20:46