大熊猫分散绘图日期时间

jma*_*jma 28 python matplotlib python-3.x pandas

我有一个包含两列datetime.time的数据框.我想分散他们的情节.我也希望轴能够显示时间,理想情况下.但

df.plot(kind='scatter', x='T1', y='T2')
Run Code Online (Sandbox Code Playgroud)

转储一堆内部绘图错误,以'T1'上的KeyError结尾.

或者,我试试

plt.plot_date(x=df.loc[:,'T1'], y=df.loc[:,'T2'])
plt.show()
Run Code Online (Sandbox Code Playgroud)

我得到'Tkinter回调中的异常',结尾的堆栈爬行很长

return _from_ordinalf(x, tz)
  File "/usr/lib/python3/dist-packages/matplotlib/dates.py", line 224, in _from_ordinalf
microsecond, tzinfo=UTC).astimezone(tz)
TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'str'
Run Code Online (Sandbox Code Playgroud)

有什么指针吗?

Aar*_*her 39

根据Tom Augspurger的建议,不是真正的答案,而是一种解决方法,就是你可以使用工作线图类型并指定点而不是线:

df.plot(x='x', y='y', style=".")
Run Code Online (Sandbox Code Playgroud)

  • 但以这种方式产生的数字和散点图并不相同. (2认同)

dvm*_*lls 7

基于Mike N的答案...转换为unix时间以正确分散,然后将轴标签从int64s转换回字符串:

type(df.ts1[0])
Run Code Online (Sandbox Code Playgroud)

pandas.tslib.Timestamp

df['t1'] = df.ts1.astype(np.int64)
df['t2'] = df.ts2.astype(np.int64)

fig, ax = plt.subplots(figsize=(10,6))
df.plot(x='t1', y='t2', kind='scatter', ax=ax)
ax.set_xticklabels([datetime.fromtimestamp(ts / 1e9).strftime('%H:%M:%S') for ts in ax.get_xticks()])
ax.set_yticklabels([datetime.fromtimestamp(ts / 1e9).strftime('%H:%M:%S') for ts in ax.get_yticks()])
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Aar*_*her 5

我认为,这不是一个答案,但是我无法编辑这个问题或将其写入评论中.

这是一个可重复的例子:

from datetime import datetime
import pandas as pd
df = pd.DataFrame({'x': [datetime.now() for _ in range(10)], 'y': range(10)})
df.plot(x='x', y='y', kind='scatter')
Run Code Online (Sandbox Code Playgroud)

这给了KeyError: 'x'.

有趣的是,你确实得到了一个情节df.plot(x='x', y='y'); 它对于默认的x范围选择不好,因为时间只有几纳秒,这很奇怪,但这是一个单独的问题.看起来如果你可以创建一个折线图,你也应该能够创建一个散点图.

关于这个问题有一个pandas github问题,但由于某种原因它被关闭了.我将在那里发表评论,看看我们是否可以重新开始那次谈话.

有一些聪明的解决方法吗?如果是这样,什么?

  • 一个非巧妙的解决方法是转换为unix时间(int64),散点图,然后摆弄轴刻度和标签. (2认同)