You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅基于一天中的时间分量绘制时间序列散点图

问题描述

我想要创建一张散点图,展示不同日期采集的数据值,且仅基于一天中的时间进行绘制。但常规时间序列绘图会包含日期分量,现有相关问题的答案都没给出仅使用日期对象时间分量的解决方案。

我尝试了两种方法,但都不符合需求:

  1. 以下代码可运行,但输出是按日期+时间绘制的,无法把不同日期的同一时段数据点聚合到同一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()
  1. 以下代码尝试仅使用时间分量,但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:50:01