之前已经介绍了如何下载气象的每日监测数据,这里就整理介绍下如何基于这些数据,计算月均值的数据。
Python版本为3.7.
这里下载了十年的某几个站点的监测数据,其中stations.csv为站点数据。
解压缩后的为大量站点的年度数据,所以需要先筛选出对应站点的数据。
参数备注:files为station中的站点编号;2011处为年份命名文件夹,这里手动修改,没写循环。
筛选并转储到后续处理的文件夹,代码如下:
import glob
import shutil
import sys
import os
outdirectory = 'D:\Codes\pythontest\yxdl\data\\2011'
file_names = glob.glob('F:\数据1\二维数据\downdata\dis\\2011\*.csv')
files = ['42398099999','44478099999','42403099999','42295099999','44477099999',
'42404099999','42406099999','41863099999','42299099999','42399099999','42423099999',
'41862099999','55773099999','43399099999','41862199999','41862199999','41859099999',
'41858099999','44461099999','44474099999','41850099999','41852099999']
#判断文件夹是否存在并创建
if os.path.exists(outdirectory):
print('%s:存在'%outdirectory)
else:
os.mkdir(outdirectory)
print('新建文件夹:%s'%outdirectory)
#file =
for i in range(0,len(files)):
print(files[i])
for file_name in file_names:
filetemp = str.split(file_name,'\\')[-1]
if (files[i]+'.csv')==filetemp:
print('copying')
shutil.copy(file_name, outdirectory)
print("finish")
然后通过pandas计算月均值。
参数备注:这里的2011也需要手动改。
计算并存储到均值计算目录,代码如下:
import pandas as pd
import glob
import shutil
import sys
outdirectory = 'D:\Codes\pythontest\yxdl\data\mean\\2011'
file_names = glob.glob('D:\Codes\pythontest\yxdl\data\\2011\*.csv')
time = 2011
#csvfile ="D:\Codes\pythontest\yxdl\data\\2021\\55773099999.csv"
import os
#判断文件夹是否存在并创建
if os.path.exists(outdirectory):
print('%s:存在'%outdirectory)
else:
os.mkdir(outdirectory)
print('新建文件夹:%s'%outdirectory)
for csvfile in file_names:
df = pd.read_csv(csvfile)
#df = pd.DataFrame(file)
# print(df.head())
df['DATE'] = pd.to_datetime(df['DATE'],format='%Y-%m-%d')
#print(df.head())
#将时间作为索引
df = df.set_index('DATE')
#保留一位小数
format1=lambda x:"%.1f"%x
#按月进行平均值统计
dfM=df.resample('M').mean()
dfM[['TEMP','MAX','MIN']]=dfM[['TEMP','MAX','MIN']].applymap(format1)#保留一位小数
#保存月平均数据
filetemp = str.split(csvfile,'\\')[-1]
filetemp = str.split(filetemp,'.')[0]
print(filetemp)
outfile = outdirectory + '\\'+filetemp +'_'+str(time)+ '_mean.csv'
dfM.to_csv(outfile,encoding='gbk')
先手动新建站点合并文件夹hebing。
根据站点编号,在hebing文件夹下创建对应的文件夹。合并代码如下:
import pandas as pd
import os
import glob
findpath = 'D:\Codes\pythontest\yxdl\data\hebing'
files = ['42398099999','44478099999','42403099999','42295099999','44477099999',
'42404099999','42406099999','41863099999','42299099999','42399099999','42423099999',
'41862099999','55773099999','43399099999','41862199999','41862199999','41859099999',
'41858099999','44461099999','44474099999','41850099999','41852099999']
for filename in files:
directory = findpath+ '\\'+filename
#判断文件夹是否存在并创建
if os.path.exists(directory):
print('%s:存在'%directory)
else:
os.mkdir(directory)
print('新建文件夹:%s'%directory)
处理完的目录结构:
然后复制移动均值数据,到刚刚在hebing下创建的各个站点文件夹目录下:
参数备注:这里的filefind需要手动改。
代码如下:
import glob
import shutil
import sys
import os
outdirectory = 'D:\Codes\pythontest\yxdl\data\hebing'
file_names = glob.glob('D:\Codes\pythontest\yxdl\data\mean\*\*.csv')
filefind = '55773099999'
for filename in file_names:
filetemp = str.split(filename,'\\')[-1]
filetemp = str.split(filetemp,'.')[0]
filetemp = str.split(filetemp,'_')[0]
dtemp=outdirectory+'\\'+filetemp
print(filetemp)
if filefind == filetemp:
print('copying')
shutil.copy(filename, dtemp)
print("finish")
移动完成后,即可合并每个站点目录下的每年月均值csv文件。
参数备注:两个编号处手动改。
代码如下:
import pandas as pd
import os
import glob
#filepath = 'D:\Codes\pythontest\yxdl\data\hebing\\42398099999'
file_names = glob.glob('D:\Codes\pythontest\yxdl\data\hebing\\44474099999\*.csv')
outdirectory = 'D:\Codes\pythontest\yxdl\data\hebing\\44474099999\hebingout'
import os
#判断文件夹是否存在并创建
if os.path.exists(outdirectory):
print('%s:存在'%outdirectory)
else:
os.mkdir(outdirectory)
print('新建文件夹:%s'%outdirectory)
for inputfile in file_names:
df = pd.read_csv(inputfile)
print(1111)
filetemp = str.split(inputfile,'\\')[-1]
filetemp = str.split(filetemp,'.')[0]
filetemp = str.split(filetemp,'_')[0]
print(filetemp)
outfile = outdirectory + '\\'+filetemp + '_hb.csv'
df.to_csv(outfile, mode='a',index=False, header=False)
然后手动将每个站点合并好的数据拷贝到zong文件夹下,再合并一次。
这部分合并代码如下:
import pandas as pd
import os
import glob
file_names = glob.glob('D:\Codes\pythontest\yxdl\data\hebing\zong\*.csv')
outdirectory = 'D:\Codes\pythontest\yxdl\data\hebing\zong'
import os
#判断文件夹是否存在并创建
if os.path.exists(outdirectory):
print('%s:存在'%outdirectory)
else:
os.mkdir(outdirectory)
print('新建文件夹:%s'%outdirectory)
for inputfile in file_names:
df = pd.read_csv(inputfile)
outfile = outdirectory + '\\'+'hb.csv'
df.to_csv(outfile, mode='a',index=False, header=False)
OK,然后到这里数据就处理得差不多了。就可以导入数据库了。具体参考博客PostgreSQL数据库导入EXCEL数据表。