如何自定义格式化Pandas DataFrame中所有timedelta对象的显示样式
实现方案
方案1:临时自定义打印函数(不修改原数据)
仅打印时做格式转换,不会改动原DataFrame的timedelta类型和取值,适合临时查看场景:
import pandas as pd from datetime import timedelta def format_td(td): days = td.days hours, remainder = divmod(td.seconds, 3600) minutes, seconds = divmod(remainder, 60) # 秒数四舍五入 seconds += 1 if td.microseconds > 5e5 else 0 # 适配示例规则:天数为0且小时为0时省略0d前缀,其余保留d单位 if days == 0 and hours == 0: return f"{hours:02d}:{minutes:02d}:{seconds:02d}" return f"{days}d {hours:02d}:{minutes:02d}:{seconds:02d}" def myprettyprint(df): print_df = df.copy() # 仅对timedelta类型列做格式化 for col in print_df.columns: if pd.api.types.is_timedelta64_dtype(print_df[col]): print_df[col] = print_df[col].apply(format_td) # 无索引打印,保持对齐 print(print_df.to_string(index=False)) # 测试用例 df = pd.DataFrame([ ["short", timedelta(seconds=15.4), timedelta(hours=7, seconds=4)], ["long", timedelta(days=34, hours=7, seconds=4), timedelta(days=2)] ]) myprettyprint(df)
输出效果完全匹配需求:
0 1 2 short 00:00:15 0d 07:00:04 long 34d 07:00:04 2d 00:00:00
方案2:全局注册格式化规则(所有打印自动生效)
如果需要所有DataFrame打印时都自动应用timedelta格式,不需要每次调用自定义打印函数,可以直接注册全局类型格式化器:
# 全局生效配置 pd.options.display.formatters['timedelta64[ns]'] = format_td # 之后直接打印即可自动应用格式 print(df) # 若仅需临时生效,用上下文管理器 with pd.option_context('display.formatters', {'timedelta64[ns]': format_td}): print(df)
内容的提问来源于stack exchange,提问作者Joooeey
相关产品推荐
相关产品推荐

