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

Pandas按昼夜时段分箱DataFrame并统计绘图,解决0点时段空值问题

解决pd.cut处理0点时段数据为空的问题

这个问题我之前也碰到过,核心原因是pd.cut默认的区间开闭规则和你设置的bins范围没覆盖到0点的小时值。咱们一步步拆解解决:

问题根源

你原代码里的bins是[0,6,12,18,23],而pd.cut默认参数right=True,也就是区间是左开右闭的:

  • 第一个区间是(0,6]——只包含1-5点的小时值,0点的小时(df.Time.dt.hour == 0)被排除在外,所以00:01-00:59的数据会生成空值。
  • 最后一个区间是(18,23]——虽然能覆盖19-23点,但0点的核心问题没解决。

两种可行的修改方案

方案1:调整bins范围,覆盖所有小时值

把bins的左边界设为-1,右边界设为24(因为小时的取值范围是0-23),这样所有小时都会被包含进对应的区间:

df = df.assign(session=pd.cut(df.Time.dt.hour, [-1, 6, 12, 18, 24], labels=['Night', 'Morning', 'Afternoon', 'Evening']))

对应的区间规则(左开右闭):

  • (-1,6] → 0-5点(Night)
  • (6,12] →6-11点(Morning)
  • (12,18] →12-17点(Afternoon)
  • (18,24] →18-23点(Evening)

方案2:修改区间开闭规则为左闭右开

设置right=False,同时把bins右边界设为24,这样区间变成左闭右开,同样覆盖所有小时:

df = df.assign(session=pd.cut(df.Time.dt.hour, [0, 6, 12, 18, 24], labels=['Night', 'Morning', 'Afternoon', 'Evening'], right=False))

对应的区间规则:

  • [0,6) →0-5点(Night)
  • [6,12) →6-11点(Morning)
  • [12,18) →12-17点(Afternoon)
  • [18,24) →18-23点(Evening)

验证和后续操作

修改后可以先验证是否还有空值:

# 查看各时段的数量,包括空值
print(df.session.value_counts(dropna=False))

之后统计行数并绘制柱状图的代码可以这样写:

import matplotlib.pyplot as plt

# 统计各时段行数
session_counts = df.session.value_counts()

# 绘制柱状图
session_counts.plot(kind='bar', color='skyblue')
plt.title('Row Count by Time Session')
plt.xlabel('Time Session')
plt.ylabel('Number of Rows')
plt.xticks(rotation=0)  # 让x轴标签不旋转,更易读
plt.show()

内容的提问来源于stack exchange,提问作者Nickel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:26:41