Python Matplotlib x 轴不正确地标记 timedelta64 对象

标签 python pandas matplotlib

我正在尝试使用 Matplotlib 从 Python 中的 Pandas 数据帧生成绘图。这是数据框的摘要。

import pandas as pd
import datetime
import matplotlib.pyplot as plt

# Summarize data frame.
>>> df.shape
(40, 4)

>>> df.dtypes
ID                         object
relative_time     timedelta64[ns]
value                     float64
relative_value            float64
dtype: object

>>> df.head()
    ID     relative_time  value  relative_value
0  001 -1 days +18:08:04    4.5            -1.0
1  001 -1 days +18:18:03    4.5            -1.0
2  001 -1 days +18:28:03    4.5            -1.0
3  001 -1 days +18:38:04    4.5            -1.0
4  001 -1 days +18:48:03    4.5            -1.0

>>> df.tail()
     ID     relative_time  value  relative_value
35  001 -1 days +23:58:03    5.5             0.0
36  001          00:08:03    5.5             0.0
37  001          00:18:03    5.5             0.0
38  001          00:28:02    5.5             0.0
39  001          00:38:04    5.5             0.0

我试图在 x 轴上绘制 relative_time 并在 y 轴上绘制 relative_value 。但是,下面的代码会产生意外的结果,我无法判断 x 轴的单位。

# Plot the desired plot.
plt.plot(test['relative_time'], test['relative_value'], marker='.')

enter image description here

请注意,上图中的 x 轴不是以小时为单位(相对于时间 0)。这样的情节如下所示。

plt.plot(test['relative_time'] / np.timedelta64(1, 'h'), test['relative_value'], marker='.')

enter image description here

如何绘制 x 轴,使其以与 relative_time 列相同的格式显示时间?例如,如果 x 轴每小时都有刻度线,则它们将被标记为 -1 days +18:00:00-1 days +19:00: 00、...、00:00:0001:00:00

最佳答案

x 轴的单位是纳秒,如输出所示

>>> df.dtypes
ID                         object
relative_time     timedelta64[ns]  <----- [ns] == nanoseconds
value                     float64
relative_value            float64
dtype: object

看起来 matplotlib 仅显示纳秒,因此您需要将这些纳秒格式化为字符串格式。不幸的是,numpy.timedelta64 数据类型的功能是有限的,我在 numpy 文档中找不到任何可以做到这一点的内容。

示例 Formatted x-axis labels

来源: matplotlib intelligent axis labels for timedelta

import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

fig = plt.figure()
ax = fig.add_subplot(111)

创建一个 np.timedelta64[ns] 值数组。这就是如果您执行 df["relative_time"].values 将会得到的结果。

# create list of times
x = [np.timedelta64(k, "ns") for k in range(0,300*10**9,10**9)]

# create some random y-axis data
y = np.random.random(len(x))

ax.plot(x, y)

# Function that formats the axis labels
def timeTicks(x, pos):
    seconds = x / 10**9 # convert nanoseconds to seconds
    # create datetime object because its string representation is alright
    d = datetime.timedelta(seconds=seconds)
    return str(d)

formatter = matplotlib.ticker.FuncFormatter(timeTicks)
ax.xaxis.set_major_formatter(formatter)
plt.show()

关于Python Matplotlib x 轴不正确地标记 timedelta64 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42216865/

相关文章:

包含整数和字符串的列表的Python排序列表,其中包含整数

pandas - 将字典拆分为df中的各个列

python - 如何检查 Pandas 系列中的所有元素是否等于特定值

python - 如何为 pandas 数据框添加标题

python - 在四维 matplotlib 曲面中更改 Facecolors

python - 将 x 轴放置在不同的 y 值处

python - 将 Flask 更改应用到 Apache2 服务器而不重新启动

python - 如何让 pyflakes 在 Windows 上运行?

python - 如何在 Python 中手动中止函数同时仍返回结果

python - Matplotlib 图形/绘图/ Canvas /布局隐藏按钮