如何仅绘制熊猫 datetime64[ns] 属性的时间

Posted

技术标签:

【中文标题】如何仅绘制熊猫 datetime64[ns] 属性的时间【英文标题】:How to plot time only of pandas datetime64[ns] attribute 【发布时间】:2021-02-19 03:31:47 【问题描述】:

我有一个格式为 datetime64[ns] 的长时间范围的数据框和一个 int 值

数据如下所示:

                  MIN_DEP  DELAY
0     2018-01-01 05:09:00      0
1     2018-01-01 05:13:00      0
2     2018-01-01 05:39:00      0
3     2018-01-01 05:43:00      0
4     2018-01-01 06:12:00     34
...                   ...    ...
77005 2020-09-30 23:42:00      0
77006 2020-09-30 23:43:00      0
77007 2020-09-30 23:43:00     43
77008 2020-10-01 00:18:00      0
77009 2020-10-01 00:59:00      0

[77010 rows x 2 columns]
MIN_DEP    datetime64[ns]
DELAY               int64
dtype: object

目标是在 x 轴上仅绘制 00:00 - 24:00 范围内的所有数据,不再有日期。

当我尝试绘制它时,时间线在任何时候都是 00:00。如何解决这个问题?

import matplotlib.dates as mdates

fig, ax = plt.subplots()
ax.plot(pd_to_stat['MIN_DEP'],pd_to_stat['DELAY'])

xfmt = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(xfmt)

plt.show()

尝试将之前的时间戳转换为 dt.time 然后绘制它

pd_to_stat['time'] = pd.to_datetime(pd_to_stat['MIN_DEP'], format='%H:%M').dt.time
fig, ax = plt.subplots()
ax.plot(pd_to_stat['time'],pd_to_stat['DELAY'])
plt.show()

情节不允许这样做:

TypeError: float() argument must be a string or a number, not 'datetime.time'

【问题讨论】:

【参考方案1】:

根据您的要求,我猜您不需要时间戳中的日期和秒字段。所以你首先需要一点预处理。 使用下面的代码删除秒字段

dataset['MIN_DEP'] = dataset['MIN_DEP'].strftime("%H:%M")

然后您可以通过以下方式从时间戳中删除日期

dataset['MIN_DEP'] = pd.Series([val.time() for val in dataset['MIN_DEP']])

然后你可以用通常的方式绘制你的数据。

【讨论】:

谢谢!但情节仍然说TypeError: float() argument must be a string or a number, not 'datetime.time' 您能否在使用我的解决方案后打印数据集的类型['MIN_DEP'] 并提及之后的数据类型是什么。 Type 是 MIN_DEP object 实际上您的解决方案与我在帖子末尾提到的 pd_to_stat['time'] = pd.to_datetime(pd_to_stat['MIN_DEP'], format='%H:%M').dt.time 完全相同。【参考方案2】:

这似乎现在有效。我没有认出,情节仍在日期分裂。为了解决这个问题,我可以用相同的日期替换所有日期并使用 DateFormatter 隐藏日期

import matplotlib.dates as mdates
pd_to_stat['MIN_DEP'] = pd_to_stat['MIN_DEP'].map(lambda t: t.replace(year=2020, month=1, day=1))

fig, ax = plt.subplots()
ax.plot(pd_to_stat['MIN_DEP'],pd_to_stat['DELAY'])

xfmt = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(xfmt)

plt.show()

【讨论】:

以上是关于如何仅绘制熊猫 datetime64[ns] 属性的时间的主要内容,如果未能解决你的问题,请参考以下文章

绘制熊猫时间增量

熊猫日期时间格式删除时区[重复]

如何比较了一系列的标量

Python/Pandas:如何从 datetime64[ns] 转换为 datetime

如何使用 datetime64[ns] 和 pandas 计算天数?

熊猫 datetime64 到字符串