空气质量数据来源于空气质量监测系统,各地区均有官方的该系统可以获取数据。
日级别数据表头如下图所示,包含站点信息、空气质量六项污染物浓度及分指数(IAQI)、空气质量指数(AQI)、首要污染物以及空气质量指数级别。
小时级别数据表头如下表所示,包含指标与日级别数据相比仅少了编码一列,其他完全相同。
无论是日级别数据还是小时级别数据,本系列专题不分析其IAQI,编码及AQI级别颜色也忽略。
数据预处理方式比较简单,主要有以下几个处理方法:
df = df[pd.notna(df['AQI'])]
df = df[df['AQI'] > 0]
df =df.drop_duplicates(keep='first').interpolate(method='linear')
空气质量监测数据一般是经过审核的,所以只需要简单的处理即可,关键的地方是如何巧妙地将需要的所有数据整合在一起,使程序自动处理,文末附上日报及实时报数据通用的处理代码。
def data_combine(self, folder_path, year_list, is_daily):
"""
原始数据整合及预处理
:param folder_path: 数据所在文件夹路径
:param year_list: 年份列表
:param is_daily: 是否是日级别(目前仅有日级别数据和时级别数据)
:return: 整合后的数据
"""
try:
if is_daily:
data_type = '日报'
else:
data_type = '实时报'
if len(year_list) == 0:
logger.info('要分析的年份数为0,分析程序终止!')
return 0
else:
same_file_name = folder_path.joinpath(
os.path.basename(folder_path) + str(year_list[0]) + '年AQI' + data_type + '数据.xls')
df = pd.read_excel(io=same_file_name, skiprows=5, header=None)
if len(year_list) > 1:
for year in year_list[1:]:
full_file_name = folder_path.joinpath(
os.path.basename(folder_path) + str(year) + '年AQI' + data_type + '数据.xls')
dfx = pd.read_excel(io=full_file_name, skiprows=5, header=None)
df = pd.concat([df, dfx])
if is_daily:
df = df.loc[:, [0, 1, 2, 4, 6, 8, 10, 12, 14, 16, 17, 18]]
else:
df = df.loc[:, [0, 1, 2, 3, 5, 7, 9, 11, 13, 15, 16, 17]]
df.columns = ['date', 'city', 'station', 'SO2', 'NO2', 'PM10', 'CO', 'O3', 'PM2.5', 'AQI', 'MP',
'AQI_LEVEL']
df['date'] = pd.to_datetime(df['date'], 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
if not is_daily:
df['hour'] = df.index.hour
df = df[pd.notna(df['AQI'])]
df = df[df['AQI'] > 0]
df = df.drop_duplicates(keep='first').interpolate(method='linear')
df['AQI_LEVEL'] = df['AQI'].map(self.number_to_flag)
logger.info(os.path.basename(folder_path) + data_type + "数据时间范围:" + str(df.index[0]) + " ~ " + str(
df.index[-1]))
return df.drop_duplicates(keep='first')
except Exception as e:
logger.error(e)
return 0
以上处理过程难度不大,但是需要勤加练习,能熟练写出数据处理部分的代码。下期进行空气质量数据年变化分析。
以下是本人独自运营的微信公众号,用于分享个人学习及工作生活趣事,大佬们可以关注一波。