如何将Pandas图表Y轴的总秒数格式化为时分秒时间显示
解决DataFrame秒数转时分秒显示及绘图Y轴格式化问题
嘿,这个需求拆成两部分处理就很顺畅——一是让DataFrame本身显示时分秒格式,二是让绘图的Y轴也同步改成时分秒格式,我给你一步步说清楚:
一、让DataFrame显示时分秒格式
这里分两种情况,看你要不要保留原始秒数用于后续计算:
情况1:直接修改数据为时分秒字符串(不保留原始数值)
如果不需要再用秒数做计算,可以直接把数值列转成时分秒格式的字符串:
import pandas as pd # 假设你的原始DataFrame是这样的 data = { 'day': ['2017-01-01'], 'Object1': [6000], 'Object2': [1234] } df = pd.DataFrame(data) df['day'] = pd.to_datetime(df['day']) df.set_index('day', inplace=True) # 把秒数列转成timedelta对象,再提取时分秒部分 df[['Object1', 'Object2']] = df[['Object1', 'Object2']].apply(pd.to_timedelta, unit='s') df[['Object1', 'Object2']] = df[['Object1', 'Object2']].astype(str).str.split().str[-1]
这样处理后,你的DataFrame就会直接显示1:40:00和00:20:34这种格式了。
情况2:保留原始秒数,仅修改显示格式(适合后续计算)
如果还要用原始秒数做统计或计算,就别改数据本身,只改显示规则:
# 用style.format临时修改显示格式,不影响原始数据 styled_df = df.style.format({ col: lambda x: f"{int(x//3600)}:{int((x%3600)//60):02d}:{int(x%60):02d}" for col in df.columns }) # 展示格式化后的表格 styled_df
或者设置全局显示格式(对所有数值列生效):
pd.options.display.float_format = lambda x: f"{int(x//3600)}:{int((x%3600)//60):02d}:{int(x%60):02d}" # 此时直接打印df就会显示时分秒 print(df)
二、让绘图的Y轴显示时分秒格式
绘图的时候建议保留原始秒数数据(保证绘图逻辑准确),只修改Y轴的标签显示格式。用Matplotlib的自定义格式化器就能实现:
import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter # 定义一个把秒数转成时分秒的函数 def sec_to_hms(x, pos): hours = int(x // 3600) minutes = int((x % 3600) // 60) seconds = int(x % 60) # 补零处理,比如分钟/秒不足两位时显示00:xx:xx return f"{hours}:{minutes:02d}:{seconds:02d}" # 绘制折线图(其他图类型同理) ax = df.plot(figsize=(10, 6)) # 设置Y轴的格式化器 ax.yaxis.set_major_formatter(FuncFormatter(sec_to_hms)) # 可选:旋转X轴日期标签,避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.show()
这样绘图出来的Y轴就会显示1:40:00这种格式,而不是原始的6000秒数值了。
内容的提问来源于stack exchange,提问作者tuxmania
相关产品推荐
相关产品推荐

