You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:39:52