【问题标题】:Plotting 'time' vs 'date' in Matplotlib在 Matplotlib 中绘制“时间”与“日期”
【发布时间】:2021-12-29 02:48:04
【问题描述】:

我有一本带有日期(年、月、日)和时间戳(小时、分钟、秒)的字典,如下所示:

dict = {datetime.date(2021, 11, 1): [datetime.time(7, 43, 23)],
 datetime.date(2021, 11, 8): [datetime.time(6, 4, 45),
                              datetime.time(6, 3, 36),
                              datetime.time(5, 56, 26)],
 datetime.date(2021, 11, 12): [datetime.time(8, 5, 11),
                               datetime.time(5, 44, 45),
                               datetime.time(5, 24, 14),
                               datetime.time(4, 56, 5)]}

我想用它做一个散点图。 首先我写了这段代码:

from matplotlib import pyplot as plt
for key, value in dict.items():
    x = [key]*len(value)
    y = value
    plt.scatter(x, y)
plt.tight_layout()
plt.show()

此代码产生错误:

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

然后我尝试使用 matplotlib.dates 转换日期时间,将我的代码更改为:

from matplotlib import pyplot as plt
import matplotlib.dates as mdates
for key, value in dict.items():
    x = [mdates.date2num(key)]*len(value)
    y = [mdates.date2num(y) for y in value]
    plt.scatter(x, y)
plt.tight_layout()
plt.show()

这段代码产生了另一个错误:

ValueError: Could not convert object to NumPy datetime

起初,问题看起来很简单。 但是,现在我不明白如何使用 matplotlib 来处理它。

我的问题:

  1. 如何使用 matplotlib 工具处理日期时间对象?
  2. 在 matplotlib 中处理 datetime 对象时如何正确设置刻度和刻度?

【问题讨论】:

    标签: python datetime matplotlib


    【解决方案1】:

    您可以使用 pandas 的日期时间功能:

    import pandas as pd
    
    arr = []
    for key, value in dict.items():
        for time in value:
            arr.append([key, time])
            
    df = pd.DataFrame(arr, columns=['day', 'time'])
    df.day = pd.to_datetime(df.day)
    df.time = pd.to_datetime(df.time.astype('str'))
    
    plt.scatter(df.day, df.time)
    

    【讨论】:

    • 非常感谢您的回复!两个问题:(1)为什么我们需要使用 df.time.astype('str') 来创建时间点? (2) 是否可以在 00:00 到 23:59 之间设置 y 轴的限制,即设为 24 小时?
    • (1) 因为否则它会抛出一个TypeError: <class 'datetime.time'> is not convertible to datetime。 (2) 可以加plt.ylim(pd.to_datetime('00:00:00'), pd.to_datetime('23:59:59'))
    【解决方案2】:

    您可以通过结合合适的虚拟日期将time 对象转换为datetime,然后进行绘图:

    from datetime import date
    from datetime import datetime
    
    value = [datetime.combine(date.today(), value) for v in value]
    scatter(x, value)
    

    matplotlib 不会为您执行此操作,因为它无法知道您想要的开始日期。

    如果您不希望日期显示在 y 轴上,请设置日期格式化程序:https://matplotlib.org/stable/api/dates_api.html

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 2019-05-14
      • 2014-03-24
      • 2019-12-14
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多