如何在Pandas中对DataFrame的时间段列进行时段分类?
解决Pandas DataFrame时段划分问题
没问题,这事儿其实挺简单的,咱们一步步来搞定它。首先得先明确四个时段的划分标准(毕竟不同场景下定义可能略有差异,我先给个通用的,你可以根据需求灵活调整):
- 早晨:6:00AM - 11:59AM
- 下午:12:00PM - 5:59PM
- 傍晚:6:00PM - 9:59PM
- 夜晚:10:00PM - 5:59AM
完整解决方案代码
先给你看完整的可运行代码,后面再拆解开讲每个步骤:
import pandas as pd # 模拟你的数据(替换成你实际的DataFrame即可) data = {'TIME': ['1:00AM to 2:00AM', '7:00AM to 8:00AM', '1:00PM to 2:00PM', '7:00PM to 8:00PM', '11:00PM to 12:00AM', '5:30AM to 6:30AM']} df = pd.DataFrame(data) # 步骤1:从TIME列提取起始时间 df['Start_Time'] = df['TIME'].str.split(' to ', expand=True)[0] # 步骤2:把时间字符串转换成datetime格式,方便提取24小时制小时数 df['Start_Time_DT'] = pd.to_datetime(df['Start_Time'], format='%I:%M%p') df['Hour_24'] = df['Start_Time_DT'].dt.hour # 步骤3:定义时段映射逻辑,生成Time_Shift列 def assign_time_shift(hour): if 6 <= hour < 12: return '早晨' elif 12 <= hour < 18: return '下午' elif 18 <= hour < 22: return '傍晚' else: return '夜晚' df['Time_Shift'] = df['Hour_24'].apply(assign_time_shift) # 查看最终结果(只保留关键列) print(df[['TIME', 'Time_Shift']])
运行后会得到这样的输出:
TIME Time_Shift 0 1:00AM to 2:00AM 夜晚 1 7:00AM to 8:00AM 早晨 2 1:00PM to 2:00PM 下午 3 7:00PM to 8:00PM 傍晚 4 11:00PM to 12:00AM 夜晚 5 5:30AM to 6:30AM 夜晚
步骤拆解说明
提取起始时间:
你的TIME列是「X to Y」的格式,我们用str.split把起始时间拆出来——因为时间段是连续的,用起始时间来判断所属时段已经足够准确(如果你的业务需要考虑跨时段的情况,比如5:30AM到6:30AM,也可以根据结束时间或者时段占比调整,不过大部分场景下起始时间就够用)。转换时间格式:
用pd.to_datetime把字符串时间转换成Pandas的datetime对象,指定format='%I:%M%p'来匹配「1:00AM」这种格式(%I是12小时制的小时,%p是AM/PM标识),然后提取24小时制的小时数,方便后续判断。映射时段:
写一个简单的函数,根据24小时制的小时数返回对应的时段标签,再用apply把函数应用到整个Hour_24列上,生成Time_Shift列。
可选简化方案:用pd.cut替代函数
如果你觉得写函数麻烦,也可以用pd.cut来快速分段,代码更简洁:
# 定义分段区间和对应标签 bins = [-1, 6, 12, 18, 22, 24] labels = ['夜晚', '早晨', '下午', '傍晚', '夜晚'] # 直接生成Time_Shift列 df['Time_Shift'] = pd.cut(df['Hour_24'], bins=bins, labels=labels, include_lowest=True)
这个效果和上面的函数完全一致,适合快速实现。
自定义调整提示
如果你的时段划分标准不一样(比如把早晨定义为7点开始,傍晚到11点结束),只需要修改函数里的数值或者bins的区间就行,非常灵活。
内容的提问来源于stack exchange,提问作者barkat khan
相关产品推荐
相关产品推荐

