如何仅基于一天中的时间分量绘制时间序列散点图
问题描述
我想要创建一张散点图,展示不同日期采集的数据值,且仅基于一天中的时间进行绘制。但常规时间序列绘图会包含日期分量,现有相关问题的答案都没给出仅使用日期对象时间分量的解决方案。
我尝试了两种方法,但都不符合需求:
- 以下代码可运行,但输出是按日期+时间绘制的,无法把不同日期的同一时段数据点聚合到同一x轴位置:
# Plotting the data fig, ax = plt.subplots() ax.scatter(x = df.Datetime, y = df.Temperature) ax.xaxis.set_major_formatter(mpl.dates.DateFormatter("%H:%M")) plt.xticks(rotation = 45) plt.show()
- 以下代码尝试仅使用时间分量,但matplotlib不接受
datetime.time类型,无法完成绘图:
# Plotting the data fig, ax = plt.subplots() ax.scatter(x = df.Datetime.dt.time, y = df.Temperature) ax.xaxis.set_major_formatter(mpl.dates.DateFormatter("%H:%M")) plt.xticks(rotation = 45) plt.show()
环境配置
import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd # 创建模拟数据(实际是从ods文件通过pd.read_excel读取) x = ['2023-06-12 09:12:00', '2023-06-12 10:15:00', '2023-06-13 09:40:00', '2023-06-13 11:20:00', '2023-06-14 09:36:00', '2023-06-14 10:51:00'] x = [pd.Timestamp.fromisoformat(date) for date in x] y = [36, 25, 29, 31, 34, 27] df = pd.DataFrame(data = {'Datetime': x, 'Temperature': y})
解决方案
方法1:将所有时间映射到同一天的datetime对象
把所有时间的日期部分替换成同一个固定日期,让matplotlib正常识别的同时,x轴仅显示时间分量:
# 提取时间部分,替换为固定日期 df['Time_On_Same_Day'] = pd.to_datetime('2023-01-01 ' + df['Datetime'].dt.strftime('%H:%M:%S')) fig, ax = plt.subplots() ax.scatter(x=df['Time_On_Same_Day'], y=df['Temperature']) # 设置x轴格式为小时:分钟 ax.xaxis.set_major_formatter(mpl.dates.DateFormatter("%H:%M")) plt.xticks(rotation=45) plt.xlabel('时间') plt.ylabel('温度') plt.show()
方法2:将时间转换为数值(小时/分钟)
把时间转换成一天中的总分钟数或小时数作为数值型x轴,再手动设置x轴刻度标签为时间格式:
# 计算一天中的总分钟数 df['Total_Minutes'] = df['Datetime'].dt.hour * 60 + df['Datetime'].dt.minute fig, ax = plt.subplots() ax.scatter(x=df['Total_Minutes'], y=df['Temperature']) # 设置x轴刻度和标签(每2小时一个刻度) tick_positions = [i*60*2 for i in range(0, 13)] tick_labels = [f"{i:02d}:00" for i in range(0, 24, 2)] ax.set_xticks(tick_positions) ax.set_xticklabels(tick_labels, rotation=45) plt.xlabel('时间') plt.ylabel('温度') plt.show()
方法3:使用matplotlib日期数值配合时间偏移
提取时间分量后,转换为matplotlib可识别的日期数值(基于同一天基准):
import matplotlib.dates as mdates # 创建基准日期 base_date = pd.Timestamp('2023-01-01') # 计算每个时间相对于基准日期的偏移量(以天为单位,1小时=1/24天) df['Time_Offset'] = df['Datetime'].dt.hour/24 + df['Datetime'].dt.minute/(24*60) + df['Datetime'].dt.second/(24*60*60) # 转换为matplotlib的日期数值 df['Matplotlib_Time'] = mdates.date2num(base_date) + df['Time_Offset'] fig, ax = plt.subplots() ax.scatter(x=df['Matplotlib_Time'], y=df['Temperature']) # 设置x轴格式和刻度间隔 ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M")) ax.xaxis.set_major_locator(mdates.HourLocator(interval=2)) plt.xticks(rotation=45) plt.xlabel('时间') plt.ylabel('温度') plt.show()
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

