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
相关产品推荐
相关产品推荐

