在 Matplotlib 中绘制“时间”与“日期”
Posted
技术标签:
【中文标题】在 Matplotlib 中绘制“时间”与“日期”【英文标题】:Plotting 'time' vs 'date' in 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 来处理它。
我的问题:
-
如何使用 matplotlib 工具处理日期时间对象?
在 matplotlib 中处理 datetime 对象时如何正确设置刻度和刻度?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于在 Matplotlib 中绘制“时间”与“日期”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 matplotlib 在日期时间轴上绘制一个矩形?
如何在pd.read.csv之后用matplotlib绘制日期?
在 matplotlib 中使用 axvspan 作为日期范围