python - Pandas 与 matplotlib 日期时间

标签 python pandas datetime matplotlib

我已经阅读了该网站上有关日期时间和时间戳以及 matplotlib date2num 等的许多问题。但是,我很好奇绘制某些数据的“正确”方法是什么。假设我有一个数据框,其索引是 Pandas DateTimeIndex。我可以直接使用 pandas 或使用 matplotlib 绘制数据:

print(dt.index)
# = DatetimeIndex(['2018-01-01 20:00:00', ..., '2018-01-03 04:00:00'],
#                 dtype='datetime64[ns]',
#                 name=u'DateTime',
#                 length=385,
#                 freq=None)

my_axis.plot(df)
print(my_axis.get_xlim())  # = (736695.72708333354, 736697.14791666681)

# vs 

df.plot(ax=my_axis)
print(my_axis.get_xlim())  # = (25247280.0, 25249200.0)

但是,它们之间的“x 轴”范围完全不同。如果我混合绘图(我需要直接使用 matplotlib 作为broken_barh),那么我看不到所有数据,因为它们具有不同的 x 坐标。是否有公认的最佳实践?

编辑以添加下面的工作示例

如果需要,我愿意升级版本。我尝试过:

# Python2 Versions:
Python: 2.7.14
Numpy: 1.13.3
Pandas: 0.20.3
Matplotlib: 2.0.0

# Python3 Version (same results)
Python: 3.6.3
Numpy: 1.12.1
Pandas: 0.19.2
Matplotlib: 2.0.0

如果我只使用 pandas 来绘制 x 和 y,那么它们都会正确显示。如果我只使用 matplotlib,那么它们都会正确显示。但是,如果我尝试用 pandas 绘制一个,用 matplotlib 绘制另一个,那么它们就不起作用(请参见底部的图片)。我的偏好是“通常”使用 pandas,这样我在使用 matplotlib 绘图时只需编辑 DateTime 索引。我对此进行了两次评论尝试,但都没有成功。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

start = '2018-01-02 03:00:00'
end = '2018-01-02 011:00:00'

data = pd.DataFrame({'DateTime': pd.date_range(start=start, end=end, freq='1H'),
                     'x': [1,2,3,4,5,4,3,2,1],
                     'y': [5,4,3,2,1,2,3,4,5]})
data = data.set_index('DateTime')
#print(data)

ax0 = plt.subplot(211)
ax1 = plt.subplot(212, sharex=ax0)

# Pandas for both
data['x'].plot(ax=ax0)
#data['y'].plot(ax=ax1)

# Matplotlib for both
#ax0.plot(data.index, data['x'])
ax1.plot(data.index, data['y'])

# Other attempts to make matplotlib plot work with pandas
# (but they produce same image as below)
#ax1.plot([mdates.date2num(d) for d in data.index], data['y'])
#ax1.plot(data.index.to_pydatetime(), data['y'])

plt.savefig('test.png')

test.png

最佳答案

matplotlib 和 pandas 日期图中的数据单位完全不同。您可以通过不共享任何轴并打印轴限制来找到答案。

import pandas as pd
import matplotlib.pyplot as plt

start = '2018-01-02 03:00:00'
end = '2018-01-02 011:00:00'

data = pd.DataFrame({'DateTime': pd.date_range(start=start, end=end, freq='1H'),
                     'x': [1,2,3,4,5,4,3,2,1],
                     'y': [5,4,3,2,1,2,3,4,5]})
data = data.set_index('DateTime')

ax0 = plt.subplot(211)
ax1 = plt.subplot(212)

# Pandas
data['x'].plot(ax=ax0)
# Matplotlib
ax1.plot(data.index, data['y'])

print ax0.get_xlim()  # (420795.0, 420803.0)
print ax1.get_xlim()  # (736696.10833333328, 736696.47500000009)

plt.show()

因此,很明显,如果您在 (420795.0, 420803.0) 范围内的一个轴上绘制值,则无法共享轴 (sharex=ax0)在另一个的 (736696.108, 736696.475) 范围内。

因此,如果出于任何原因您需要在其中一个共享轴上使用 matplotlib 绘图,则也需要对所有其他共享轴使用 matplotlib。

关于python - Pandas 与 matplotlib 日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48354195/

相关文章:

python - 如何并行处理 CSV 文件?

python - 应用 Pandas 创建列方法和函数

python - 对多列进行复杂聚合的 Pandas groupby

sqlite3 日期和间隔函数

php - 在错误格式的两个日期字段之间搜索

使用 tkinter 的 Python 多线程

python - 将常规 Python 字符串转换为原始字符串

python - 无法访问docker容器内的jupyter笔记本

python - 通过 3D x、y、z 散点图数据拟合一条线

Java:ResultSet getString() 因环境而异