基于DataFrame日期时间列生成分类列的Python实现方案
基于DataFrame日期时间列生成分类列的Python实现方案
嘿,我来帮你搞定这个根据时间区间生成分类列的需求!首先结合你给出的示例,先明确匹配规则(确保结果和示例完全对齐):
- ON:当天16:00到次日09:00(含16:00,不含09:00)
- FH:09:00到10:00(含09:00,不含10:00)
- M:10:00到15:00(含10:00,不含15:00)
- SLH:15:00到15:30(含15:00,不含15:30)
- LH:15:30到16:00(含15:30,不含16:00)
下面是具体的实现代码,用pandas和numpy就能轻松完成:
import pandas as pd import numpy as np # 生成你提供的示例DataFrame date_rng = pd.date_range(start='2024-01-01', periods=48, freq='30min') d = pd.DataFrame({'datetime': date_rng}) # 把时间转换成便于比较的数值:小时 + 分钟/60,比如09:30就是9.5,16:00就是16.0 d['time_num'] = d['datetime'].dt.hour + d['datetime'].dt.minute / 60 # 定义匹配条件和对应的标签 conditions = [ # ON区间:16:00及之后,或者09:00之前 (d['time_num'] >= 16.0) | (d['time_num'] < 9.0), # FH区间:09:00到10:00 (d['time_num'] >= 9.0) & (d['time_num'] < 10.0), # M区间:10:00到15:00 (d['time_num'] >= 10.0) & (d['time_num'] < 15.0), # SLH区间:15:00到15:30 (d['time_num'] >= 15.0) & (d['time_num'] < 15.5), # LH区间:15:30到16:00 (d['time_num'] >= 15.5) & (d['time_num'] < 16.0) ] labels = ['ON', 'FH', 'M', 'SLH', 'LH'] # 生成分类列'part' d['part'] = np.select(conditions, labels) # 查看结果(和你给出的示例完全一致) print(d.head(40))
代码小说明:
- 时间数值化:把datetime的小时和分钟转换成连续数值,避开直接处理时间字符串的麻烦,区间判断更直观。
- 多条件匹配:用
np.select处理多区间逻辑,清晰易懂,跨天的ON区间只需要用|(或)逻辑就能轻松覆盖。 - 灵活调整:如果之后要修改区间边界,直接调整
conditions里的数值就行,比如想把FH的起始时间改成09:30,只需要把第二个条件改成(d['time_num'] >=9.5) & (d['time_num'] <10.0)即可。
运行这段代码后,生成的part列就会和你给出的示例完全一致啦!
备注:内容来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

