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

