【问题标题】:How to plot datetime time with matplotlib?如何使用 matplotlib 绘制日期时间?
【发布时间】:2020-08-11 17:11:15
【问题描述】:

我有以下熊猫数据框

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

data = {'date': ['09:50:00', '09:55:00', '10:00:00', '10:05:00', '10:10:00', '10:15:00', '10:20:00', '10:25:00', '10:30:00', '10:35:00'],
        'bidopen': [1.33872, 1.33824, 1.33768, 1.33732, 1.33786, 1.33798, 1.33752, 1.33749, 1.33718, 1.3374],
        'bidclose': [1.33824, 1.33768, 1.33732, 1.33786, 1.33798, 1.33752, 1.33749, 1.33718, 1.3374, 1.33766],
        'bidhigh': [1.33889, 1.33832, 1.33774, 1.33786, 1.33814, 1.33815, 1.33776, 1.33781, 1.33765, 1.33769],
        'bidlow': [1.33822, 1.33766, 1.33716, 1.33725, 1.3378, 1.33747, 1.33742, 1.33712, 1.33714, 1.33729],
        'askopen': [1.33891, 1.33842, 1.33787, 1.33751, 1.33803, 1.33816, 1.33768, 1.3377, 1.33735, 1.3376],
        'askclose': [1.33842, 1.33787, 1.33751, 1.33803, 1.33816, 1.33768, 1.3377, 1.33735, 1.3376, 1.33785],
        'askhigh': [1.33908, 1.3385, 1.33793, 1.33804, 1.33832, 1.33834, 1.33795, 1.338, 1.33782, 1.33787],
        'asklow': [1.33838, 1.33784, 1.33734, 1.33743, 1.33799, 1.33765, 1.33762, 1.33728, 1.33733, 1.33749],
        'tickqty': [875, 818, 886, 600, 704, 837, 947, 1010, 1178, 567]}

df = pd.DataFrame(data)

df['date'] = pd.to_datetime(df['date'])
df['date'] = df['date'].dt.time

print(df.head(10).to_string())

plt.plot(df['date'], df['bidhigh'])
plt.show()

我无法在 x 轴上绘制时间列,在 y 轴上绘制 bidghigh 列。我收到此错误:

Traceback (most recent call last):

  File "<ipython-input-55-3572052619ce>", line 1, in <module>
plt.plot(x, y)

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2825, in plot
**({"data": data} if data is not None else {}), **kwargs)

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 1745, in plot
self.add_line(line)

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1969, in add_line
self._update_line_limits(line)

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1991, in _update_line_limits
path = line.get_path()

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/lines.py", line 1011, in get_path
self.recache()

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/lines.py", line 653, in recache
x = _to_unmasked_float_array(xconv).ravel()

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/matplotlib/cbook/__init__.py", line 1289, in _to_unmasked_float_array
return np.asarray(x, float)

  File "/home/mahmoud/anaconda3/envs/fxenv/lib/python3.7/site-packages/numpy/core/_asarray.py", line 85, in asarray
return array(a, dtype, copy=False, order=order)

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

我的问题是:如何在 x 轴上绘制日期列,在 y 轴上绘制 bidhigh 列?

【问题讨论】:

    标签: python-3.x pandas matplotlib


    【解决方案1】:

    您的问题是df['date'] = df['date'].dt.time 行。

    删除该行并将该列保留为 Timestamp 对象不会导致错误。您始终可以使用以下方式格式化轴上的显示:

    import matplotlib.dates as mdates
    myFmt = mdates.DateFormatter('%H:%M:%S') 
    # Check https://strftime.org/ for formatters
    ax.xaxis.set_major_formatter(myFmt)
    

    查看this 帖子了解更多详情。

    例如,我绘制bidopen 相对于时间戳:

    为了便于阅读,我已将轴格式化为 Hour:Min:Seconds 并将标签旋转 45 度并使用 plt.xticks(rotation=45)

    代码清单(非最佳实践):

    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    
    df = pd.read_csv("/tmp/SO_63363129.csv")
    df['timestamp'] = pd.to_datetime(df['date'])
    
    fig, ax = plt.subplots()
    ax.plot(df['timestamp'], df['bidopen'))
    ax.format_xdata = mdates.DateFormatter('%H:%M:%S')
    plt.xticks(rotation=45)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-14
      • 2019-12-14
      • 2019-08-14
      • 1970-01-01
      • 2021-12-29
      • 2016-05-15
      • 2015-12-23
      • 2014-03-24
      相关资源
      最近更新 更多