gpt4 book ai didi

python - hvplot/holoviews (bokeh) 带负值格式化程序的时间增量轴

转载 作者:行者123 更新时间:2023-12-05 03:21:25 25 4
gpt4 key购买 nike

问题:

我正在尝试使用 hvplot 或 holoviews( Bokeh 后端)在 x 轴上绘制具有时间增量值的 pandas 时间增量索引数据。

标签只是整数,似乎以毫秒为单位。
我希望将它们格式化为更友好的格式,例如 HH:MM:SS

示例

import pandas as pd
import numpy as np
import hvplot.pandas

x = pd.timedelta_range(start=0, freq='S', periods=11) - pd.Timedelta('5S')
y = np.arange(len(x))
df = pd.DataFrame({'y': y}, index=x)
df.hvplot.line(rot=20)

输出: enter image description here我希望 x 轴为 -00:00:04 -00:00:04 00:00:00 00:00:02 00:00:04
或至少以秒为单位,这似乎是毫秒。

我尝试了什么

使用上面的 df 创建:

from bokeh.models.formatters import NumeralTickFormatter
df.hvplot.line(xformatter=NumeralTickFormatter(format="00:00:00"), rot=20)

输出: enter image description here我不知道 xlabels 在这里发生了什么,但它们没有任何意义。

使用 DatetimeTickFormatter:

from bokeh.models.formatters import DatetimeTickFormatter
df.hvplot.line(rot=20, xformatter=DatetimeTickFormatter())

enter image description here

不幸的是不起作用:没有负值:- 00:00:02 变为 58s

最佳答案

我找到了一个解决方案,它不是很漂亮但是很有效
(使用之前创建的数据框):

def timedelta_formatter(x):
x/=1000 # ms -> seconds

# extract seconds, minutes, hours, days from time
m, s = divmod(abs(x), 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)

# create output string with time format
out = f"{d}d. {h:02}:{m:02}:{s:02}"

if x < 0:
# add - if negative value
return "- " + out
else:
return out
df.hvplot.line(xformatter=timedelta_formatter, rot=20)

输出: enter image description here

这看起来更好!

让我们尝试使用以天为单位的 timedelta 范围:

x = pd.timedelta_range(start=0, freq='D', periods=11) - pd.Timedelta('5D')
y = np.arange(len(x))
df = pd.DataFrame({'y': y}, index=x)
df.hvplot.line(xformatter=timedelta_formatter, rot=20)

输出: enter image description here

同样有效

我仍然认为这不是最优雅的解决方案,
乐于倾听更好的解决方案

关于python - hvplot/holoviews (bokeh) 带负值格式化程序的时间增量轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73001737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com