大熊猫分散绘图日期时间

时间:2014-12-14 18:27:48

标签: python python-3.x matplotlib pandas

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

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

在' T1'上转储一堆以KeyError结尾的内部情节错误。

或者,我试试

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'

任何指针?

5 个答案:

答案 0 :(得分:33)

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

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

答案 1 :(得分: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')

这会给KeyError: 'x'

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

关于此问题有a pandas github issue,但由于某种原因它已关闭。我将在那里发表评论,看看我们是否可以重新开始那次谈话。

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

答案 2 :(得分:4)

以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

答案 3 :(得分:2)

这是帮助您入门的基本工作。

import matplotlib, datetime
import matplotlib.pyplot as plt

def scatter_date(df, x, y, datetimeformat):
  if not isinstance(y, list):
      y = [y]
  for yi in y:
      plt.plot_date(df[x].apply(
          lambda z: matplotlib.dates.date2num(
              datetime.datetime.strptime(z, datetimeformat))), df[yi], label=yi)
  plt.legend()
  plt.xlabel(x)

# Example Usage
scatter_date(data, x='date', y=['col1', 'col2'], datetimeformat='%Y-%m-%d')

答案 4 :(得分:1)

它并不漂亮,但作为一个快速黑客,您可以在加载到Pandas之前使用.timestamp()将DateTime转换为时间戳,并且散布将正常工作(尽管完全无法使用的x轴)。