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

如何在Pandas中将秒数字段转换为时分格式并分组展示平均时长?

解决方案

1. 修正AVG列的错误处理

你之前将AVG列转为datetime64[ns]的操作是错误的——datetime用于表示时间点,而你的AVG列是时长秒数,会被解析为1970 epoch的纳秒偏移,导致出现无意义的日期格式。

先确保AVG列是数值类型(若读取后为字符串,先转换):

import pandas as pd

df = pd.read_csv('practice.csv')
# 若AVG是字符串格式,执行以下转换
# df['AVG'] = pd.to_numeric(df['AVG'], errors='coerce')

2. 编写时长转换函数

定义函数将总秒数转为小时:分钟格式,支持超过24小时的场景:

def seconds_to_hhmm(total_seconds):
    hours = int(total_seconds // 3600)
    minutes = int((total_seconds % 3600) // 60)
    return f"{hours}:{minutes:02d}"
  • 逻辑:用整除3600得到总小时数,取余3600后整除60得到剩余分钟数,02d保证分钟为两位数字(如5分钟显示为05)。

3. 分组计算并转换格式

先按Activity分组求平均秒数,再应用转换函数得到目标格式:

# 分组计算平均秒数
grouped_avg = df.groupby('Activity')['AVG'].mean().reset_index()
# 转换为小时:分钟格式
grouped_avg['AVG_formatted'] = grouped_avg['AVG'].apply(seconds_to_hhmm)

此时grouped_avg包含每个活动的平均秒数和格式化后的时长。

4. 绘制柱状图

用matplotlib绘制柱状图,直观展示各活动平均时长:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
bars = plt.bar(grouped_avg['Activity'], grouped_avg['AVG'])
plt.xlabel('活动类型')
plt.ylabel('平均时长(秒)')
plt.title('各活动平均时长对比')

# 在柱子上方标注格式化后的时长
for bar, formatted in zip(bars, grouped_avg['AVG_formatted']):
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height + 2,
             formatted, ha='center', va='bottom')

plt.show()

用原始秒数绘图能保证数据准确性,柱子上方的格式化标签则让结果更易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:01:21