Pandas散点绘制日期

2024-09-28 20:43:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两列datetime.time的数据框。我想散点绘制它们。理想情况下,我也希望坐标轴能显示时间。但是

df.plot(kind='scatter', x='T1', y='T2')

转储一堆以“T1”上的键错误结尾的内部绘图错误。

或者,我试着

plt.plot_date(x=df.loc[:,'T1'], y=df.loc[:,'T2'])
plt.show()

我得到了“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'

有什么线索吗?


Tags: 数据fromdfdatetimetimeplot错误plt
3条回答

不是一个真正的答案,而是一个解决办法,正如Tom Augspurger建议的那样,您可以只使用工作线打印类型并指定点而不是线:

df.plot(x='x', y='y', style=".")

不是答案,但我想我不能编辑这个问题或在评论中加入这么多内容。

下面是一个可重复的示例:

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')

这给出了KeyError: 'x'

有趣的是,你只需要df.plot(x='x', y='y')就可以得到一个图;它对于默认的x范围选择得很差,因为时间间隔只有纳秒,这很奇怪,但这是一个单独的问题。如果你能画一个线图,你也应该能画一个散点图。

有关于这个问题的a pandas github issue,但它是由于某种原因关闭的。我要去那里发表评论,看看我们能否重新开始对话。

有什么聪明的办法吗?如果是,怎么办?

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

type(df.ts1[0])

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()

enter image description here

相关问题 更多 >