首页 > 解决方案 > Python:DateTime-Objects 可以在 matplotlib 中绘制,但只是有时?

问题描述

因此,我制作了一个如下所示的 DataFrame:

在此处输入图像描述

DF 按日期时间对象按时间顺序排列。这些 DateTimes 是通过将包含时间戳的列“attributes.timestamp”转换为字符串生成的:

df["DateTime"] = df["attributes.timestamp"].apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%SZ'))

相应的 y 值是对相应分钟内的对象进行计数的计数器。当我尝试在 matplotlib 中绘制这个 DF 时,它确实有效。它将日期时间对象作为 x 值并绘制该分钟的计数,如下所示:

在此处输入图像描述

现在当然看起来很愚蠢,必须在 x 轴上显示完整的 DateTime 对象。它按此顺序显示月、日和小时(在示例中是 3 月 2 日下午 2 点到 20 点)。我希望它只显示小时(或至少只显示时间,而不是随之而来的整个日期)。所以我尝试向 DF 添加一个新列(称为“时间”)。该列将使用以下代码从 DateTime 列中提取时间:

df["Time"] = df["DateTime"].time()

但是,这不起作用,因为它给了我属性错误“'系列'对象没有属性'时间'”。相反,我尝试了其他方法。当我生成 DateTime 对象并向其中添加“.time()”时,我只是重复了之前使用的整个代码。

df["Time"] = df["attributes.timestamp"].apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%SZ').time())

我不知道为什么,但现在它工作得很好。我能够从我的 Datetime 对象中添加时间:

在此处输入图像描述

我的下一个想法是使用 x 轴上的“时间”列而不是整个日期时间进行绘图。来自计数器的 y 值保持不变。但由于某种原因,这不起作用。当我尝试这样绘制它时,它给了我以下错误: TypeError: float() argument must be a string or a number, not 'datetime.time' 奇怪的是,使用整个 DateTime-object 绘制时没有问题. 我不知道,为什么提取的时间会成为问题,因为它也是按时间顺序排列的值。

我的问题是:为什么我的方法不起作用?并且:有什么办法可以解决这个问题吗?

标签: pythonpandasdataframedatetimematplotlib

解决方案


Matplotlib 支持绘制 pandas DatetimeIndex 以及 numpydatetime64对象,但不支持datetime.time. 此外,df["Time"] = df["DateTime"].time()它不起作用,因为您将该.time()方法应用于 Series 本身,而不是应用于其中的 Series 元素,这些元素是pandas.Timestamp确实.time()定义了该方法的对象。

要回答您的主要问题,您只希望 x 轴不显示冗余信息,是吗?而不是只为 itme 创建一个新列,正确的方法是使用matplotlib.dates.DateFormatter.

这是一个最小的例子:

import matplotlib.pyplot as plt
import pandas as pd

# Example DatetimeIndex and data
x = pd.date_range(start='2020-05-10', end='2020-05-11', freq='1h')
y = list(range(len(x)))

fig, ax = plt.subplots()
plt.plot(x, y)

# The following specifies the format for dates
import matplotlib.dates as mdates
date_fmt = mdates.DateFormatter('%I: %M%p')
ax.xaxis.set_major_formatter(date_fmt)

# autofmt_xdate helps with auto-rotating dates so they do not overlap
fig.autofmt_xdate()
plt.show()

至于如何知道要传递什么字符串,格式DateFormatter请参考https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior 。strftime

Matplotlib 有一个页面专门用于修复您可能会发现有用的常见日期烦恼:https ://matplotlib.org/3.1.1/gallery/recipes/common_date_problems.html


推荐阅读