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

Matplotlib每日每2小时原始数据点绘制问题求助

解决Matplotlib每日每2小时原始数据点绘图问题

核心实现思路

要替换原有的每日均值为每2小时原始数据点,核心是跳过均值计算逻辑,改为按2小时时间窗口筛选对应窗口内的原始数据,需重点处理:

  • 跨天CSV文件的读取(覆盖最近24小时的所有数据文件)
  • 完整时间序列的拼接与解析
  • 按2小时间隔精准提取原始数据点

具体代码修改方案

假设你的Graph24H类已有基础的文件读取逻辑,以下是修改后的核心代码:

1. 修改数据获取方法

import pandas as pd
from datetime import datetime, timedelta

class Graph24H:
    def get_data_for_last_24h(self):
        # 定义最近24小时的时间范围
        end_time = datetime.now()
        start_time = end_time - timedelta(hours=24)
        
        # 生成需要读取的CSV文件名(覆盖跨天场景)
        date_range = pd.date_range(start=start_time.date(), end=end_time.date())
        csv_files = [date.strftime("%Y-%m-%d") + ".csv" for date in date_range]
        
        # 读取并合并所有目标CSV
        all_data = []
        for file in csv_files:
            try:
                df = pd.read_csv(file)
                # 拼接日期与时间戳,生成完整datetime对象
                file_date = datetime.strptime(file.split(".")[0], "%Y-%m-%d")
                df["Datetime"] = df["Timestamp"].apply(
                    lambda x: datetime.strptime(x, "%H-%M-%S").replace(
                        year=file_date.year, month=file_date.month, day=file_date.day
                    )
                )
                all_data.append(df)
            except FileNotFoundError:
                continue
        
        if not all_data:
            return pd.DataFrame()
        
        combined_df = pd.concat(all_data)
        # 筛选最近24小时内的有效数据
        filtered_df = combined_df[(combined_df["Datetime"] >= start_time) & (combined_df["Datetime"] <= end_time)]
        
        # 按每2小时窗口分组,提取每组第一个原始数据点(可按需改为最后一个/最接近整点的点)
        time_bins = pd.date_range(start=start_time.floor("2h"), end=end_time.ceil("2h"), freq="2h")
        filtered_df["TimeBin"] = pd.cut(filtered_df["Datetime"], bins=time_bins, labels=time_bins[:-1])
        hourly_points = filtered_df.groupby("TimeBin").first().reset_index()
        
        return hourly_points

2. 修改绘图逻辑

替换原均值绘图代码,改为绘制原始数据点:

import matplotlib.pyplot as plt

def plot_24h_raw_points(self):
    data = self.get_data_for_last_24h()
    if data.empty:
        return
    
    fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 8))
    
    # DO参数绘图
    ax1.scatter(data["TimeBin"], data["DO"], color="blue", label="DO")
    ax1.plot(data["TimeBin"], data["DO"], color="blue", linestyle="--", alpha=0.5)
    ax1.set_ylabel("DO")
    ax1.legend()
    ax1.grid(True)
    
    # pH参数绘图
    ax2.scatter(data["TimeBin"], data["pH"], color="green", label="pH")
    ax2.plot(data["TimeBin"], data["pH"], color="green", linestyle="--", alpha=0.5)
    ax2.set_ylabel("pH")
    ax2.legend()
    ax2.grid(True)
    
    # Temperature参数绘图
    ax3.scatter(data["TimeBin"], data["Temperature"], color="red", label="Temperature")
    ax3.plot(data["TimeBin"], data["Temperature"], color="red", linestyle="--", alpha=0.5)
    ax3.set_xlabel("Time (2-hour intervals)")
    ax3.set_ylabel("Temperature")
    ax3.legend()
    ax3.grid(True)
    
    plt.tight_layout()
    plt.show()

效果说明

  • 当前效果:单图显示每个参数的日均值,仅1个数据点/参数
  • 期望效果:每个参数显示12个原始数据点(对应24小时内每2小时一个点),点间用虚线连接便于观察趋势,保留原始数据真实性

关键注意事项

  • 若需提取窗口内最接近2小时整点的数据点,可将groupby("TimeBin").first()替换为自定义逻辑:计算每个数据点与窗口起始时间的差值,取差值最小的点
  • 处理无数据的时间窗口:可通过reindex方法为空白窗口填充NaN,避免绘图时出现断点
  • 确保CSV文件的时间戳格式严格为HH-MM-SS,若存在格式不一致需提前做清洗处理

内容的提问来源于stack exchange,提问作者Cloud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:22:06