如何在Pandas中构建无日期、支持切片的小时分钟时间索引?
解决时间索引切片问题的实用方案
方法1:转成纯时间类型索引(最贴合需求)
直接把分组得到的小时+分钟MultiIndex,组合成datetime.time类型的索引,这样就能直接按'10:00':'11:00'切片,绘图也不会带多余日期:
import pandas as pd from datetime import time # 假设你的聚合后数据是df,MultiIndex是['hour', 'minute'] # 把索引里的小时和分钟拼成HH:MM格式的字符串,再转成time对象 df['time'] = df.index.map(lambda idx: f"{idx[0]:02d}:{idx[1]:02d}") df['time'] = df['time'].apply(time.fromisoformat) # 设置成新索引,删掉原来的MultiIndex,记得排序 df = df.set_index('time').sort_index() # 现在直接切片就行 sliced_df = df['10:00':'11:00']
方法2:用时间差索引替代
如果觉得time类型用着不习惯,也可以把小时和分钟转成时间差(Timedelta)作为索引,切片时用'10h'或者'10h0m'这种格式:
# 计算每个索引对应的总分钟数,转成Timedelta total_minutes = df.index.get_level_values('hour')*60 + df.index.get_level_values('minute') delta_idx = pd.to_timedelta(total_minutes, unit='m') df = df.set_index(delta_idx).sort_index() # 切片示例 sliced_df = df['10h':'11h']
方法3:修复虚拟日期法的问题
要是你之前的虚拟日期法不想放弃,只需要在绘图时手动设置坐标轴格式,就能去掉多余的日期标签,切片也能正常用:
import matplotlib.dates as mdates # 用虚拟日期(比如2000-01-01)把MultiIndex转成datetime索引 df.index = pd.to_datetime(df.index.map(lambda idx: f"2000-01-01 {idx[0]:02d}:{idx[1]:02d}")) # 绘图时设置x轴只显示时分 ax = df.plot() ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) # 切片可以直接写时间(因为日期都一样) sliced_df = df.loc['10:00':'11:00']
推荐用方法1,完全符合你要的纯时间切片需求,绘图也不用额外处理,最省心。
内容的提问来源于stack exchange,提问作者Physmatik
相关产品推荐
相关产品推荐

