前言
一般城市均有空气质量的网格化监测设施,本文将对其监测数据进行分析。
分析说明
本文仅对数据缺失情况、颗粒物浓度及超标记录、噪声强度进行分析。原始数据格式如下:
(图片右键新标签页打开会很清晰)
核心代码解析
(1)数据获取
def data_capture(file_path_list):
if len(file_path_list) == 0:
logger.get_log().info("输入文件数目为零")
return
else:
try:
df = pd.read_excel(io=file_path_list[0], skiprows=1, header=None)
for file_path in file_path_list:
if file_path is not file_path_list[0]:
dfx = pd.read_excel(io=file_path, skiprows=1, header=None)
df = pd.concat([df, dfx], axis=0)
df = df.iloc[:, [0, 2, 4, 5, 8, 17]]
df.columns = ['企业名称', '所属区域', '监测时间', 'PM2.5', 'PM10', 'DB']
df['date'] = pd.to_datetime(df['监测时间'], format='%Y%m%d')
df.set_index('date', inplace=True)
df['year'] = df.index.year
df['month'] = df.index.month
df['day'] = df.index.day
df['PM10_STD'] = [150] * len(df['PM10'])
df['PM2.5_STD'] = [75] * len(df['PM2.5'])
logger.get_log().info("数据时间范围:" + str(df.index[0]) + " ~ " + str(df.index[-1]))
return df.drop_duplicates(keep='first')
except Exception as e:
logger.get_log().error(e)
return
(2)数据缺失检测,时间段之间(不含首尾)极为缺失时间段
def lack_detect(df, enterprise, address):
if df.index[0].day != 1:
logger.get_log().info(
address + enterprise + '缺失时间段: ' + datetime.datetime(df.index[0].year, df.index[0].month, 1).strftime(
"%Y-%m-%d") + ' ~ ' + str(
df.index[0]))
if df.index[-1].day != calendar.mdays[df.index[0].month]:
logger.get_log().info(
address + enterprise + '缺失时间段: ' + str(df.index[-1]) + ' ~ ' + datetime.datetime(df.index[0].year,
df.index[0].month,
calendar.monthrange(
df.index[0].year,
df.index[0].month)[
1]).strftime("%Y-%m-%d"))
for i in range(df.index.size - 1):
if (df.index[i + 1] - df.index[i]).days != 1:
logger.get_log().info(enterprise + '缺失时间段: ' + str(df.index[i]) + ' ~ ' + str(df.index[i + 1]))
(3)超标状况检测
def over_standard_detect(df):
df_10 = df[(df['PM10_STD'] <= df['PM10'])]
df_25 = df[(df['PM2.5_STD'] <= df['PM2.5'])]
df_25.to_csv(PATH / '监测站点PM2.5超标统计.csv', encoding='gbk')
df_10.to_csv(PATH / '监测站点PM10超标统计.csv', encoding='gbk')
(4)颗粒物浓度及噪声强度日变化趋势
def ent_plot(df, enterprise, address):
index = pd.date_range(start=df.index[0], end=df.index[-1], freq='5D')
new_path = Path(PATH / address)
if not os.path.exists(new_path):
os.mkdir(new_path)
fig = plt.figure()
plt.subplot(211)
plt.plot(df['PM2.5'], label='PM$_{2.5}$', linewidth=2, color='black', marker='o', markerfacecolor='red',
markersize=4)
plt.plot(df['PM10'], label='PM$_{10}$', linewidth=2, color='red', marker='o', markerfacecolor='black', markersize=4)
plt.plot(df['PM2.5_STD'], label='PM$_{2.5}$二级标准', linewidth=2, color='black', linestyle='--')
plt.plot(df['PM10_STD'], label='PM$_{10}$二级标准', linewidth=2, color='red', linestyle='--')
plt.xticks(index, '')
plt.ylabel('浓度(${μg}$/m${^3}$)')
# plt.tick_params(axis='y', labelsize=18)
plt.legend(loc='upper left', fontsize=18)
plt.legend(bbox_to_anchor=(1, 0.6))
plt.subplot(212)
plt.plot(df['DB'], label='噪声', linewidth=2, color='green', marker='o', markerfacecolor='y', markersize=4)
plt.xticks(index, index.strftime('%Y-%m-%d'), rotation=15)
plt.ylabel('分贝(dB)')
plt.legend(bbox_to_anchor=(1.22, 0.2))
plt.savefig(
new_path / (enterprise + '站' + str(df.index[0].year) + '年' + str(
df.index[0].month) + '月' + '颗粒物浓度及噪声强度变化曲线.jpg'),
bbox_inches='tight')
plt.show()
分析结果
仅展示图片结果,生成的超标情况记录在csv文件中,数据缺失状况在日志文件中。可以看出,颗粒物存在超标的情况。
(图片右键新标签页打开会很清晰)
以下是本人独自运营的微信公众号,用于分享个人学习及工作生活趣事,大佬们可以关注一波。