Plotly时间差轴显示2T等标识问题及格式化方法咨询
问题与解答
问题描述
我遇到的问题和某Stack Overflow问题类似。我有一个DataFrame,包含diff和date列,数据类型如下:
delta_df['diff'].dtype >>> dtype('<m8[ns]') delta_df['date'].dtype >>> datetime64[ns, UTC]
二者在某种程度上等价,但用Plotly绘制直方图和散点图时,diff轴出现了奇怪的单位,比如2T、2.5T、3T等。而diff列的数据显示为0 days 00:29:36.000001,date列数据为2018-06-11 01:04:25.000005+00:00,我无法理解这种现象。
注:diff列是通过df['date'].diff()生成的。
我的问题:
- 这里的T是什么?是Plotly选定的标准单位(比如代表30分钟,2T即1小时)吗?如果是,怎么查看T对应的具体值?
- 更重要的是,怎么让轴显示和列中一致的格式,方便阅读?
解答
1. 关于单位"T"
Plotly里的T是**分钟(minute)**的缩写,属于ISO 8601时间格式的标准符号,比如2T就是2分钟,2.5T就是2分30秒,并不是你猜测的30分钟。常见的时间单位缩写还有:
s:秒H:小时D:天W:周
2. 设置轴显示匹配DataFrame的格式
要让diff轴显示和DataFrame里一致的0 days HH:MM:SS.ffffff格式,有两种可行方案:
方案一:转换为毫秒数后自定义格式化
先把diff列转换为总毫秒数,再通过自定义函数把刻度值转回timedelta格式:
import plotly.express as px import pandas as pd # 将diff转换为总毫秒数 delta_df['diff_ms'] = delta_df['diff'].dt.total_seconds() * 1000 # 绘制图表 fig = px.scatter(delta_df, x='date', y='diff_ms') # 定义格式化函数 def format_tick(ms): return str(pd.to_timedelta(ms, unit='ms')) # 更新y轴刻度文本 fig.update_yaxes( ticktext=[format_tick(tick) for tick in fig.layout.yaxis.tickvals], tickvals=fig.layout.yaxis.tickvals ) fig.show()
方案二:直接使用Plotly时间格式化字符串
Plotly支持直接用格式化字符串指定timedelta的显示格式,尝试以下代码:
import plotly.express as px fig = px.scatter(delta_df, x='date', y='diff') # 设置y轴刻度格式为DataFrame中显示的样式 fig.update_yaxes(tickformat="%d days %H:%M:%S.%f") fig.show()
如果上述格式化不生效,可尝试将diff列转为字符串后绘图(适合数据量不大的场景):
delta_df['diff_str'] = delta_df['diff'].astype(str) fig = px.scatter(delta_df, x='date', y='diff_str') fig.show()
内容的提问来源于stack exchange,提问作者J Agustin Barrachina
相关产品推荐
相关产品推荐

