爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12373|回复: 6

[源代码] python 批量处理中国空气质量历史数据

[复制链接]

新浪微博达人勋

发表于 2021-12-24 14:04:46 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 veroniaca 于 2021-12-25 11:25 编辑

污染物数据网站链接:https://quotsoft.net/air/

因为这是站点的小时资料,并且每天的数据都是一个csv文件,想要获得几年的空气质量数据(如PM2.5,PM10,O3等)处理起来就会非常麻烦,所以编写了以下代码,供大家使用(不过代码运行起来速度很慢,因为是python小白,用的都是最简单的语句去写)

数据处理的逻辑就是:
1.先创建一个二维数据(时间 * 站点)
2.再根据时间将站点数据读入(之所以这样,是因为每个CSV文件的站点数不一样,所以对应的行也不一致,所以选用了只有通过if语句,将站点对应之后,再把数据写入)
  1. import pandas as pd
  2. import os
  3. import numpy as np
  4. import datetime

  5. inputfile =  "G:/python/PM25_PM10/Particle/test/" #输入文件路径,就是你要读取的批量日文件
  6. outputfile = "G:/python/PM25_PM10/Particle/test/test1/test_output.csv"  #输出文件的路径

  7. file_path   = inputfile
  8. output_path = outputfile

  9. #build station list   #这个站点列表是网站上写出的,但是我把2016-2020的站点都放了进去
  10. station_file = "G:/python/PM25_PM10/Particle/2020station.xlsx"

  11. station_name = pd.read_excel(io = station_file)  #读取站点文件
  12. station      = station_name["Station"]
  13. num_station  = station_name.shape[0]  #获取行数,
  14. station      = station.tolist()
  15. #print(station[0])

  16. i=0
  17. for filename in os.listdir(file_path):
  18.      dirs         = file_path + filename
  19.      #read data
  20.      pms          = pd.read_csv(dirs)
  21.      pms_25       = pms[pms.type == "PM2.5"]   #这个是提取某个元素的资料,我提取的是PM2.5和PM10的,因为要计算PM2.5/PM10的比值
  22.      pms_10       = pms[pms.type == "PM10"]
  23.      column       = pms_25.shape[1] #获取列数
  24.      row          = pms_25.shape[0] #获取行数
  25.      #print(pms.columns[3]) 等同于#print(pms[pms_25.columns[3]])  等同于#print(pms_25.iloc[:,3])  #这句可忽略!!!

  26.      #build empty data     #开始创建一个二维数据
  27.      data_build   =  np.zeros((row,num_station))
  28.      data_build   =  pd.DataFrame(data_build)
  29.    
复制代码
接上面:
  1. #about time  #这下面一大段都是时间格式的转换,因为想要写进文件的格式是yyyy-mm-dd hh:mm,方便之后时间的筛选
  2.     yymmdd       = np.array(pms_25["date"])
  3.     yymmdd       = yymmdd.tolist()
  4.     yymmdd       = [str(x) for x in yymmdd]
  5.    
  6.     year         =np.empty(row)
  7.     month        =np.empty(row)
  8.     day          =np.empty(row)
  9.    
  10.     for i in range (0,row):
  11.         year[i]  = yymmdd[i][0:4]   
  12.         month[i] = yymmdd[i][4:6]
  13.         day[i]   = yymmdd[i][6:8]
  14.    
  15.     year  = [int(x) for x in year]
  16.     month = [int(x) for x in month]
  17.     day   = [int(x) for x in day]   
  18.    
  19.     hour  = np.array(pms_25["hour"])
  20.    
  21.     date = {}
  22.    
  23.     for i in range (0,row):
  24.             date[i] = datetime.datetime(year[i], month[i], day[i], hour[i])
  25.     date =list(date.values())
  26.    
  27.     #data columns and index
  28.     data_build.columns = station
  29.     data_build.index   = date
  30.    
  31.     #input data
  32.     for i in range (3,column):
  33.             num = 0
  34.             for j in range (i,num_station):
  35.                     if pms_25.columns[i] == station[j-3]:
  36.                             for k in range (0,row):               
  37.                                     data_build.iloc[k,j-3] = pms_25.iloc[k,i]/pms_10.iloc[k,i]
  38.                                     #print(data_build.iloc[i,j-3])
  39.                                 break
  40.    
  41.     data_build.to_csv(output_path,mode ="a")
复制代码
以上代码基本修改最前面的路径名,就可以使用了。

2020station.xlsx

104.2 KB, 下载次数: 27, 下载积分: 金钱 -5

评分

参与人数 2金钱 +11 贡献 +5 收起 理由
mofangbao + 10 + 5
lsaad + 1

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2021-12-24 14:07:20 | 显示全部楼层
本帖最后由 veroniaca 于 2021-12-25 11:25 编辑

如果需要删除列标题,
可以将data_build.to_csv(output_path,mode ="a")改成以下代码:
  1. file = file + 1            
  2. if file > 1:
  3.     data_build.to_csv(output_path,mode ="a",header=0,index = 1)
  4. else:
  5.      data_build.to_csv(output_path,header=1,index = 1)

复制代码
或者生成文件后,运行下面代码....

  1. import pandas as pd
  2. import os
  3. import numpy as np
  4. import datetime

  5. inputfile =  "G:/python/PM25_PM10/Particle/output/output/"
  6. outputfile = "G:/python/PM25_PM10/Particle/output/output_deal/"


  7. file_path   = inputfile
  8. output_path = outputfile

  9. for filename in os.listdir(file_path):
  10.     dirs          = file_path + filename
  11.     output_path   = outputfile + filename
  12.     #read data
  13.     pms           = pd.read_csv(dirs)

  14.     #set the first column as "time"
  15.     pms.rename(columns = {'Unnamed: 0':"time"},inplace =True)
  16.    
  17.     #fill nan value of the column "time" as "time"
  18.     df          = pms["time"].fillna("time")
  19.    
  20.     #set the list "df" as index
  21.     pms.set_index(df,inplace = True)
  22.    
  23.     #delete the row which the index is “time”
  24.     pms_deleted = pms.drop(["time"],axis = 0)
  25.    
  26.     #delete the column same as index
  27.     pms_deleted = pms_deleted.drop(["time"],axis = 1)
  28.    
  29.     #output
  30.     pms_deleted.to_csv(output_path)
复制代码


密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-1-5 11:05:36 | 显示全部楼层
学习学习!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-1-16 13:13:59 | 显示全部楼层
脚本运行有问题~
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2022-9-6 22:40:07 | 显示全部楼层
你好,请问运行后出现“PermissionError: [Errno 13] Permission denied”是什么原因?文件我也没有打开,并在管理员模式下运行的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2022-9-23 16:08:37 | 显示全部楼层
zhuizhu 发表于 2022-9-6 22:40
你好,请问运行后出现“PermissionError: [Errno 13] Permission denied”是什么原因?文件我也没有打开, ...

不好意思,请问代码改了什么地方呢?是需要用到PM2.5和TSP吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-4-15 15:53:23 | 显示全部楼层
想咨询一下大佬如何日平均,它的很多日期都不全
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表