如何在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
相关产品推荐
相关产品推荐

