Pandas 如何用explode拆分START_HOUR至END_HOUR为逐小时独立行
小时区间Explode展开实现方法
常见调用失败原因
- 直接对整数类型的
START_HOUR、END_HOUR列调用explode()无法生效:explode方法仅支持展开列中存储的可迭代对象(列表、numpy数组、Series等),对普通标量整数列执行该操作不会产生拆行效果。
分步实现流程
- 逐行生成两个小时边界之间的连续整数序列,存储为新的可迭代类型列
- 对新生成的小时序列列执行
explode()完成逐小时拆行 - 调整列名、删除原始起止小时字段,匹配预期输出结构
完整可运行代码
import pandas as pd import numpy as np # 载入原始DataFrame existing_data = {'STORE_ID': ['1234','5678','9876','3456','6789'], 'FULFILLMENT_TYPE': ['DELIVERY','DRIVE','DELIVERY','DRIVE','DELIVERY'], 'FORECAST_DATE':['2020-08-01','2020-08-02','2020-08-03','2020-08-04','2020-08-05'], 'DAY_OF_WEEK':['SATURDAY','SUNDAY','MONDAY','TUESDAY','WEDNESDAY'], 'START_HOUR':[8,8,6,7,9], 'END_HOUR':[19,19,18,19,17]} existing = pd.DataFrame(data=existing_data) # 逐行生成小时区间数组 # 默认规则为左闭右开:从START_HOUR开始,到END_HOUR的前一个小时结束 # 若需要包含END_HOUR,将arange的右端点调整为 row['END_HOUR'] + 1 即可 existing['hour_range'] = existing.apply( lambda row: np.arange(row['START_HOUR'], row['END_HOUR']), axis=1 ) # 执行explode展开 result = existing.explode('hour_range') # 整理列结构匹配预期输出 result = result.rename(columns={'hour_range': 'HOUR'}) result = result.drop(columns=['START_HOUR', 'END_HOUR'])
结果说明
- 展开后每一条原始记录会按照区间内的小时数拆分为独立行,除逐小时递增的
HOUR列外,其余字段值均与原记录保持一致 - 调整区间包含规则时,仅需修改
np.arange的边界参数,无需改动其他流程逻辑
内容的提问来源于stack exchange,提问作者Sayonti
相关产品推荐
相关产品推荐

