Python绘制时间直方图问题:Pandas DataFrame时间列处理遇阻
解决Pandas中仅按时间(不含日期)分组绘制直方图的问题
嘿,我懂你卡在哪了——你用df['datetime'].dt.time生成的time列是datetime.time类型,而pd.Grouper的freq参数根本不支持这种类型,它只对datetime64类型的列生效。咱们换个思路来解决这个问题,给你两种实用的方案:
方案一:将时间转换为数值型(一天中的总秒数),再分组
这种方法把时间转换成可计算的数值,用分箱的方式实现10分钟间隔的分组:
# 计算每个时间点距离当天0点的总秒数 df['total_seconds'] = df['datetime'].dt.hour * 3600 + df['datetime'].dt.minute * 60 + df['datetime'].dt.second # 定义10分钟间隔的分箱(0到86400秒,每600秒一个区间) bins = range(0, 24*3600 + 600, 600) # 给每个分箱生成易读的时间标签,比如"07:00"、"07:10" labels = [f"{h:02d}:{m:02d}" for h, m in [(b//3600, (b%3600)//60) for b in bins[:-1]]] # 将总秒数分配到对应的时间区间 df['time_bin'] = pd.cut(df['total_seconds'], bins=bins, labels=labels, include_lowest=True) # 统计每个区间的记录数,按时间顺序排序 time_counts = df['time_bin'].value_counts().sort_index() # 绘制直方图 time_counts.plot(kind='bar', figsize=(12, 6), title='10-Minute Interval Time Histogram')
方案二:统一日期后用Grouper分组
这个方法保留datetime64类型,把所有记录的日期统一成同一天,这样就能正常使用pd.Grouper的频率参数了:
# 将所有datetime的日期部分替换成固定日期(比如2020-01-01),只保留时间部分 df['fixed_date_datetime'] = pd.to_datetime('2020-01-01') + (df['datetime'] - df['datetime'].dt.normalize()) # 按10分钟频率分组,统计每组的记录数 grouped_df = df.groupby(pd.Grouper(key='fixed_date_datetime', freq='10Min')).count() # 把索引转换成易读的时间格式(比如"07:00") grouped_df.index = grouped_df.index.strftime('%H:%M') # 绘制直方图 grouped_df['datetime'].plot(kind='bar', figsize=(12, 6), title='10-Minute Interval Time Histogram')
为什么之前的方法失效?
dt.time返回的是原生Python的datetime.time对象,这种类型没有时间间隔(freq)的属性,pd.Grouper无法识别并按指定频率分组。必须把时间转换成Pandas能处理的时间序列类型(比如统一日期后的datetime64),或者数值型的时间指标(比如总秒数),才能实现按间隔分组的需求。
内容的提问来源于stack exchange,提问作者user6615439
相关产品推荐
相关产品推荐

