如何在Pandas中对DataFrame的时间值进行区间分类?
解决时间值的分箱分类问题
这问题我碰到过,pd.cut确实只认数值型数据,直接扔时间字符串肯定行不通,不过咱们先把时间转换成可计算的数值再处理,几步就能搞定,看下面的操作:
步骤1:正确创建并预处理时间DataFrame
你原来的DataFrame创建代码有小问题,时间值得用字符串包裹,而且最好先转成时间格式,方便后续提取关键数值:
import pandas as pd # 正确构建初始DataFrame df = pd.DataFrame(['02:00:00', '04:00:00', '07:00:00'], columns=['time']) # 将字符串时间转换为datetime类型 df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S') # 提取小时数作为分箱用的数值列 df['hour'] = df['time'].dt.hour
步骤2:自定义分箱区间与对应标签
根据你的需求,咱们手动定义区间范围和对应的时间段标签:
# 分箱区间(左闭右开逻辑,最后一个区间用24覆盖当天剩余时间) bins = [0, 2, 4, 7, 24] # 对应每个区间的可读性标签 labels = ['0am-2am', '2am-4am', '4am-7am', '7am-12pm']
步骤3:用pd.cut完成分类映射
现在就可以用pd.cut把小时数映射到对应的时间段类别了:
df['time_category'] = pd.cut(df['hour'], bins=bins, labels=labels, include_lowest=True)
include_lowest=True是为了让第一个区间包含0点的时间(比如00:00:00会被分到0am-2am)- 如果需要调整时间区间,直接修改
bins和labels就行,比如想分更细的时段,加对应的数值和标签就好。
最终结果示例
运行完上面的代码,你的DataFrame会变成这样:
time hour time_category 0 1900-01-01 02:00:00 2 2am-4am 1 1900-01-01 04:00:00 4 4am-7am 2 1900-01-01 07:00:00 7 7am-12pm
补充小技巧
如果不想单独提取小时列,也可以直接把时间转换成一天内的总秒数来做分箱,原理完全一致:
df['total_seconds'] = df['time'].dt.hour * 3600 + df['time'].dt.minute * 60 + df['time'].dt.second # 对应的bins要转换成秒数,比如2小时=7200秒,4小时=14400秒 bins_seconds = [0, 7200, 14400, 25200, 86400] df['time_category'] = pd.cut(df['total_seconds'], bins=bins_seconds, labels=labels, include_lowest=True)
内容的提问来源于stack exchange,提问作者wild west
相关产品推荐
相关产品推荐

