读写csv文件 可选择部分列进行操作 按列来统计 并形成字典

用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)

猜你喜欢

转载自blog.csdn.net/liuchengzimozigreat/article/details/81461366
今日推荐