# 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}")
以下是对上述代码功能的详细解释:
- 导入模块:
- 导入
pandas
库,用于数据处理和分析。 - 导入
matplotlib.pyplot
库,用于数据可视化。
- 导入
- 全局变量定义:
- 定义了一些长度常量,如
LEN_OF_START
、LEN_OF_LENGTH
、LEN_OF_CRC
和LEN_OF_TAIL
,但其具体用途在提供的代码中未体现。
- 定义了一些长度常量,如
- 函数
csv_re
:- 尝试读取 CSV 文件:
- 使用
pd.read_csv
函数读取名为231040100304曹炜.csv
的文件,并为列命名为['ST', 'MN', 'SystemTime', 'a29026', 'w21003', 'a34013']
,将Na
、NaN
和-
视为缺失值。 - 使用
drop_duplicates
方法去除重复行。
- 使用
- 数据筛选和统计计算:
- 筛选出
a29026
列不为空的数据,存储在a29026_df
中,并计算a29026
列的最大值,将结果四舍五入到三位小数。 - 筛选出
w21003
列不为空的数据,存储在w21003_df
中,定义了find_mode
函数,使用Counter
计算w21003
列的众数,并将结果四舍五入到两位小数(如果众数存在)。 - 筛选出
a34013
列不为空的数据,存储在a34013_df
中,计算a34013
列的中位数,将结果四舍五入到一位小数。
- 筛选出
- 数据填充和排序:
- 将
a29026_df
中的w21003
、a34013
和a29026
列的缺失值分别用mean_dc3_w21003
、mean_dc3_a34013
和mean_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_df1
、w21003_df1
和a34013_df1
中。
- 读取
- 数据可视化:
- 创建一个
figsize
为(10, 6)
的图形。 - 设置字体为
SimHei
。 - 绘制三条曲线,分别为
a29026_df1
的SystemTime
与a29026
列、w21003_df1
的SystemTime
与w21003
列、a34013_df1
的SystemTime
与a34013
列,设置不同的颜色和标签。 - 设置图表的标题为
新任务挥发性有机物监测-地表水质量监测-空气质量监测变化曲线
,设置x
轴标签为日期
,y
轴标签为采集值
,显示网格,添加图例。 - 将生成的图形保存为
231040100304曹炜.png
。
- 创建一个
- 异常处理:
- 处理文件未找到的异常和其他可能的异常,打印相应的错误信息。
- 尝试读取 CSV 文件:
总之,该代码的主要功能是读取 CSV 文件,对数据进行筛选、统计计算、填充缺失值和排序操作,将处理后的数据保存为新的 CSV 文件,然后对筛选后的数据进行可视化,以展示不同监测指标随时间的变化曲线,同时对可能出现的异常进行捕获和处理。