格式化pandas y轴以显示时间而不是总秒数

tux*_*nia 5 python label duration matplotlib pandas

我在数据框中有测量.列是不同的对象.Index是datetime64索引.现在,对于每个日期,我对每列的总秒数(int)进行了测量.

一切都很好,我唯一的问题,而不是在y轴上显示6000秒我想显示1:40表示1小时40分钟.

我怎么能真正实现这个目标?

day         Object1  Object2
2017-01-01     6000     1234
Run Code Online (Sandbox Code Playgroud)

我想要

day         Object1  Object2
2017-01-01  1:40:00  00:20:34 
Run Code Online (Sandbox Code Playgroud)

你能否告诉我如何做到这一点

jez*_*ael 9

这是可能的,但ploting timedelta本身并不支持.

df['Object1'] = pd.to_timedelta(df['Object1'], unit='s')
df['Object2'] = pd.to_timedelta(df['Object2'], unit='s')
Run Code Online (Sandbox Code Playgroud)

要么:

cols = ['Object1', 'Object2']
df[cols] = df[cols].apply(lambda x: pd.to_timedelta(x, unit='s'))
Run Code Online (Sandbox Code Playgroud)
print (df)
          day  Object1  Object2
0  2017-01-01 01:40:00 00:20:34
Run Code Online (Sandbox Code Playgroud)

但有可能通过FuncFormatter:

df = pd.DataFrame({'Object1': [6000, 4000, 3000], 'Object2':[3000,5000,2110]})

import matplotlib.ticker as tkr
import datetime

def func(x, pos):
    return str(datetime.timedelta(seconds=x))
fmt = tkr.FuncFormatter(func)


ax = df.plot(x='Object1', y='Object2', rot=90)
ax.xaxis.set_major_formatter(fmt)
ax.yaxis.set_major_formatter(fmt)
Run Code Online (Sandbox Code Playgroud)

图形

  • 提及*尚不支持使用timedelta进行投票*,绝对值得多加推荐:-) (2认同)