熊猫散点图日期时间
Posted
技术标签:
【中文标题】熊猫散点图日期时间【英文标题】:pandas scatter plotting datetime 【发布时间】:2015-02-12 20:53:23 【问题描述】:我有一个包含两列 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'
任何指针?
【问题讨论】:
由于您没有指定 tz 参数,我猜它试图从您的日期时间中解析它。只是一个猜测。你能发布一个你的日期时间格式的例子吗? 这些是 datetime.time 的,所以 TZ 对我来说真的没有意义。df.loc[:,'T1'].values[0] ==> datetime.time(0, 15, 43)
同意。抱歉,帮不上什么忙
用minimal example 重新创建错误怎么样?
【参考方案1】:
不是答案,但我认为我无法编辑问题或在评论中添加这么多内容。
这是一个可重现的例子:
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关于这个问题,但由于某种原因它被关闭了。我要去那里发表评论,看看我们是否可以重新开始对话。
是否有一些巧妙的解决方法?如果有,是什么?
【讨论】:
一个不太聪明的解决方法是转换为 unix 时间(int64 的),散点图,然后摆弄轴刻度和标签。 @jma:你可以试试matplotlib.dates
【参考方案2】:
根据 Tom Augspurger 的建议,这不是一个真正的答案,而是一种解决方法,您可以只使用工作线图类型并指定点而不是线:
df.plot(x='x', y='y', style=".")
【讨论】:
但是这样生成的图和散点图不一样。 详细说明@ZillGate 评论 - 在这种情况下,x 轴只是“x”值的列表。它们不一定是按顺序排列的,并且它们的间距不合适(除非您的 x 轴值一开始是均匀分布的)。 也代替 '.'可以使用 ',' 表示较小的点,使用 'o' 表示较大的点【参考方案3】:以下是帮助您入门的基本工作。
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】:它并不漂亮,但作为一种快速破解,您可以在加载到 Pandas 之前使用 .timestamp()
将 DateTime 转换为时间戳,并且散点图可以正常工作(尽管 x 轴完全不可用)。
【讨论】:
【参考方案5】:以 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()
【讨论】:
以上是关于熊猫散点图日期时间的主要内容,如果未能解决你的问题,请参考以下文章