用pandas读取部分列,可以参考第一部分代码。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
此程序将原始数据中无关的列给去掉了,只保留时间、ID、等列,另外pandas还在第一列添加了索引列
'''
import pandas as pd
from pandas import *
import os
import re
#返回指定路径下所有".csv"文件的文件名列表
def eachFile(filepath):
pathDir = os.listdir(filepath) #返回指定路径下所有文件名的列表
dir_list = []
for allDir in pathDir:
if re.search('.csv', allDir) != None:
dir_list.append(allDir)
return dir_list
#读取原始数据中需要的列,并存之于新文件中
def modify(filename):
path = u"G:\\研究\\SZ_AWS\\SZ_AWS\\" + filename
file = open(path,errors = 'ignore')
#usecols控制程序只读部分列的数据
data = pd.read_csv(file, usecols=['DDATETIME', 'OBTID', 'WD3SMAXDF', 'WD3SMAXDD', 'WD10MAXDF', 'WD10MAXDD']) #pandas读取csv时选择第一行来标记一列
filename = u'G:\\研究\\AWS\\AWS\\mod\\modified_' + filename
data.to_csv(filename) #pandas写文件时会在你的数据前加一列索引
print(filename + ' has been successfully created!')
if __name__ == '__main__':
filePath = u"G:\\研究\\SZ_AWS\\SZ_AWS\\" #文件所在的路径
dir_list = eachFile(filePath) #文件名列表
print(dir_list)
for filename in dir_list:
modify(filename)
第二部分代码是我想要统计站点记录的数据总数,比如A站点数据多少个,B站点数据多少个,最后将所有少于一定数量的站点给删除。这里可以直接将pandas读取出的series数据给转换成熟悉的字典来进行后续处理:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import csv
import sys
import os
import re
import pandas as pd
import numpy as np
#返回指定目录下的所有.csv文件
def eachFile(filepath):
pathDir = os.listdir(filepath) #返回指定路径下所有文件和文件夹的名字,并存放于一个列表中
dir_list = []
for allDir in pathDir:
if re.search('.csv', allDir) != None: #search()会扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配
dir_list.append(allDir)
return dir_list
#返回文件中数据少于6132个的站点的列表
def less_70pct_ID(file):
f = open(file)
data = pd.read_csv(f, usecols = ['OBTID'])
cnt = data['OBTID'].value_counts() #统计OBTID这一列,每个值出现的次数,返回的是一个series类型
cnt.to_dict() #将series类型转换成字典类型
lst_of_less_70pct_ID = []
for ID in cnt.keys():
if cnt[ID] < 6132: #365*24*70%=6132,站点记录的数据若是小于此值,则不合格
lst_of_less_70pct_ID.append(ID)
print(ID,':',cnt[ID])
return lst_of_less_70pct_ID
#将将列表去重后返回该列表
def rmv_rpt(lst):
new_lst = []
for ID in lst:
if ID not in new_lst:
new_lst.append(ID)
return new_lst
def rmv_unwanted_ID(filename, unwanted_ID_lst):
sav_filename = filename.replace('stage1', 'stage2') #repalce()方法是把字符串中所有匹配到的都替换,并不是只替换第一个匹配到的子串
if os.path.exists(sav_filename):
os.remove(sav_filename) #删除文件
with open(sav_filename, 'w', newline = '') as target_f:
writer = csv.writer(target_f)
with open(filename, 'r') as src_f:
rows = csv.reader(src_f) #这样读csv文件,遍历时每一行是一个列表
to_save_line1 = 1
cnt = 0
for row in rows:
cnt = cnt + 1
if to_save_line1 == 1: #第一行说明性内容保存下来
writer.writerow(row)
to_save_line1 = 0
continue
elif row[1] not in unwanted_ID_lst: #ID不属于unwanted_ID_lst则改行可保留
writer.writerow(row)
print(sav_filename + 'has successfully created!')
if __name__ == '__main__':
#获取目标文件列表
filepath = u'G:\\深圳季风研究\\SZ_AWS\\SZ_AWS\\mod\\qualified_stage1_modified_data\\'
dir_list = eachFile(filepath)
#获取数据中不满足一致性的站点的列表
lst_of_less_70pct_ID = []
for file in dir_list:
print(file)
file = filepath + file
print(file)
year_lst_of_less_70pct_ID = less_70pct_ID(file)
print(year_lst_of_less_70pct_ID)
lst_of_less_70pct_ID = lst_of_less_70pct_ID + year_lst_of_less_70pct_ID
lst_of_less_70pct_ID = rmv_rpt(lst_of_less_70pct_ID)
print(lst_of_less_70pct_ID)
for file in dir_list:
file = filepath + file
print(file)
rmv_unwanted_ID(file, lst_of_less_70pct_ID)