python代码读取 CSV 文件,对数据进行筛选、统计计算、填充缺失值和排序操作

# coding=utf-8
# 231040100304 曹炜

import pandas as pd
import matplotlib.pyplot as plt

LEN_OF_START = 2
LEN_OF_LENGTH = 4
LEN_OF_CRC = 4
LEN_OF_TAIL = 2


def csv_re():
    try:
        df = pd.read_csv('231040100304曹炜.csv', names=['ST', 'MN', 'SystemTime', 'a29026', 'w21003', 'a34013'], na_values=['Na', 'NaN', '-'])
        df.drop_duplicates(inplace=True)

        a29026_df = df[df["a29026"].notna()].copy()
        w21003_df = df[df["w21003"].notna()].copy()
        a34013_df = df[df["a34013"].notna()].copy()

        # 求 a29026 的最大值
        mean_dc3_a29026 = a29026_df["a29026"].max()
        mean_dc3_a29026 = round(mean_dc3_a29026, 3)

        # 求 w21003 的众数
        from collections import Counter

        def find_mode(s):
            counter = Counter(s)
            if not counter:
                return None
            most_common = counter.most_common(1)
            if most_common and most_common[0][1] > 1:
                return most_common[0][0]
            else:
                return None

        mean_dc3_w21003 = find_mode(w21003_df["w21003"])
        if mean_dc3_w21003 is not None:
            mean_dc3_w21003 = round(mean_dc3_w21003, 2)

        # 求 a34013 的中位数
        mean_dc3_a34013 = a34013_df["a34013"].median()
        mean_dc3_a34013 = round(mean_dc3_a34013, 1)

        a29026_df['w21003'] = a29026_df['w21003'].fillna(mean_dc3_w21003)
        a29026_df['a34013'] = a29026_df['a34013'].fillna(mean_dc3_a34013)
        a29026_df["a29026"] = a29026_df["a29026"].fillna(mean_dc3_a29026)
        a29026_df.sort_values(by=['SystemTime'], inplace=True, ascending=True)
        a29026_df.to_csv("231040100304曹炜plot.csv", mode='a', index=False, header=False)

        w21003_df['a29026'] = w21003_df['a29026'].fillna(mean_dc3_a29026)
        w21003_df['a34013'] = w21003_df['a34013'].fillna(mean_dc3_a34013)
        w21003_df["w21003"] = w21003_df["w21003"].fillna(mean_dc3_w21003)
        w21003_df.sort_values(by=['SystemTime'], inplace=True, ascending=True)
        w21003_df.to_csv("231040100304曹炜plot.csv", mode='a', index=False, header=False)

        empty_rows = df[df[['a29026', 'w21003', 'a34013']].isna().all(axis=1)]
        a34013_df = pd.concat([a34013_df, empty_rows], ignore_index=True)
        a34013_df['a29026'] = a34013_df['a29026'].fillna(mean_dc3_a29026)
        a34013_df['w21003'] = a34013_df['w21003'].fillna(mean_dc3_w21003)
        a34013_df["a34013"] = a34013_df["a34013"].fillna(mean_dc3_a34013)
        a34013_df.sort_values(by=['SystemTime'], inplace=True, ascending=True)
        a34013_df.to_csv("new_plot.csv", mode='a', index=False, header=False)

        df1 = pd.read_csv('new_plot.csv', names=['ST', 'MN', 'SystemTime', 'a29026', 'w21003', 'a34013'], na_values=['Na', 'NaN', '-'])
        df1['SystemTime'] = pd.to_datetime(df1['SystemTime'], format="%Y%m%d%H%M%S%f")
        a29026_df1 = df1[df1["ST"] == 27].copy()
        w21003_df1 = df1[df1["ST"] == 21].copy()
        a34013_df1 = df1[df1["ST"] == 22].copy()

        plt.figure(figsize=(10, 6))
        plt.rcParams['font.family'] = 'SimHei'
        plt.plot(a29026_df1['SystemTime'], a29026_df1['a29026'], label='DV1-a29026', color='b')
        plt.plot(w21003_df1['SystemTime'], w21003_df1['w21003'], label='DV1-w21003', color='r')
        plt.plot(a34013_df1['SystemTime'], a34013_df1['a34013'], label='DV2-a34013', color='g')

        plt.title('新任务挥发性有机物监测-地表水质量监测-空气质量监测变化曲线')
        plt.xlabel('日期')
        plt.ylabel('采集值')
        plt.grid(True)
        plt.legend()
        plt.savefig('231040100304曹炜.png')
    except FileNotFoundError as e:
        print(f"文件未找到错误:{e}")
    except Exception as e:
        print(f"其他错误:{e}")

以下是对上述代码功能的详细解释:

  1. 导入模块
    • 导入 pandas 库,用于数据处理和分析。
    • 导入 matplotlib.pyplot 库,用于数据可视化。
  2. 全局变量定义
    • 定义了一些长度常量,如 LEN_OF_STARTLEN_OF_LENGTHLEN_OF_CRCLEN_OF_TAIL,但其具体用途在提供的代码中未体现。
  3. 函数 csv_re
    • 尝试读取 CSV 文件:
      • 使用 pd.read_csv 函数读取名为 231040100304曹炜.csv 的文件,并为列命名为 ['ST', 'MN', 'SystemTime', 'a29026', 'w21003', 'a34013'],将 NaNaN- 视为缺失值。
      • 使用 drop_duplicates 方法去除重复行。
    • 数据筛选和统计计算:
      • 筛选出 a29026 列不为空的数据,存储在 a29026_df 中,并计算 a29026 列的最大值,将结果四舍五入到三位小数。
      • 筛选出 w21003 列不为空的数据,存储在 w21003_df 中,定义了 find_mode 函数,使用 Counter 计算 w21003 列的众数,并将结果四舍五入到两位小数(如果众数存在)。
      • 筛选出 a34013 列不为空的数据,存储在 a34013_df 中,计算 a34013 列的中位数,将结果四舍五入到一位小数。
    • 数据填充和排序:
      • a29026_df 中的 w21003a34013a29026 列的缺失值分别用 mean_dc3_w21003mean_dc3_a34013mean_dc3_a29026 填充,然后按 SystemTime 列升序排序,并将结果追加保存到 231040100304曹炜plot.csv 文件中。
      • w21003_df 进行类似的填充和排序操作,将结果追加保存到 231040100304曹炜plot.csv 文件中。
      • a34013_df 与全为空的行合并,填充缺失值,排序后保存到 new_plot.csv 文件中。
    • 再次读取和数据筛选:
      • 读取 new_plot.csv 文件,将 SystemTime 列转换为 datetime 类型。
      • 筛选出 ST 等于 27、21 和 22 的数据,分别存储在 a29026_df1w21003_df1a34013_df1 中。
    • 数据可视化:
      • 创建一个 figsize(10, 6) 的图形。
      • 设置字体为 SimHei
      • 绘制三条曲线,分别为 a29026_df1SystemTimea29026 列、w21003_df1SystemTimew21003 列、a34013_df1SystemTimea34013 列,设置不同的颜色和标签。
      • 设置图表的标题为 新任务挥发性有机物监测-地表水质量监测-空气质量监测变化曲线,设置 x 轴标签为 日期y 轴标签为 采集值,显示网格,添加图例。
      • 将生成的图形保存为 231040100304曹炜.png
    • 异常处理:
      • 处理文件未找到的异常和其他可能的异常,打印相应的错误信息。

总之,该代码的主要功能是读取 CSV 文件,对数据进行筛选、统计计算、填充缺失值和排序操作,将处理后的数据保存为新的 CSV 文件,然后对筛选后的数据进行可视化,以展示不同监测指标随时间的变化曲线,同时对可能出现的异常进行捕获和处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值