如何为分钟级datetime数据集分配自定义非整点时段
解决方案
方法1:纯Python实现(适用于单条或少量数据)
核心解决思路:datetime.datetime类型无法直接和datetime.time类型比较,只需要对datetime对象调用.time()方法提取时间部分,即可完成比较。同时修正原有代码的区间判断逻辑错误:
import datetime as dt # 提前把阈值转换为time对象,避免函数内重复计算提升效率 TIME_THRESHOLDS = [ (dt.time(3, 0), '0000-0259'), (dt.time(9, 0), '0300-0859'), (dt.time(12, 30), '0900-1229'), (dt.time(17, 0), '1230-1659'), (dt.time(19, 30), '1700-1929'), (dt.time(20, 30), '1930-2029'), (dt.time(23, 59, 59), '2030-2359') ] def time_slot(ref_datetime): # 提取datetime的时间部分 ref_time = ref_datetime.time() for threshold, slot in TIME_THRESHOLDS: if ref_time < threshold: return slot return '2030-2359' # 测试示例 test_dt = dt.datetime(2021,11,8,12,35,0) print(time_slot(test_dt)) # 输出 1230-1659
方法2:Pandas实现(适用于批量数据集处理)
如果数据存储在DataFrame中,用分箱的方式效率更高,无需写嵌套判断,后续调整时段规则也更方便:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'datetime': pd.to_datetime([ '2021-11-08 00:10:00', '2021-11-08 01:10:00', '2021-11-08 02:25:00', '2021-11-08 03:55:00', '2021-11-08 06:55:00', '2021-11-08 12:35:00', '2021-11-08 16:05:00', '2021-11-08 17:10:00', '2021-11-08 18:45:00', '2021-11-08 19:10:00', '2021-11-08 20:25:00', '2021-11-08 20:55:00', '2021-11-08 22:55:00' ]) }) # 计算当天0点开始的总分钟数,用数字比较更高效 df['minutes_of_day'] = df['datetime'].dt.hour * 60 + df['datetime'].dt.minute # 定义分箱边界(单位:分钟)和对应标签 bins = [0, 180, 540, 750, 1020, 1170, 1230, 1440] labels = ['0000-0259', '0300-0859', '0900-1229', '1230-1659', '1700-1929', '1930-2029', '2030-2359'] # 分箱匹配时段,right=False表示左闭右开区间,符合时段规则 df['time_slot'] = pd.cut(df['minutes_of_day'], bins=bins, labels=labels, right=False)
内容的提问来源于stack exchange,提问作者Rhoo
相关产品推荐
相关产品推荐

