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
相关产品推荐
相关产品推荐

