之前有提到过CSV文件

CSV文件:将数据作为一系列以逗号分隔的值写入文件。在excel中就是以表格线代替逗号

csv python 解析 python分析csv文件_CSV

csv模块

包含在Python标准库里,可以用于分析CSV文件中的数据行,让我们提取感兴趣的数值。

import csv

filename=r'C:\Users\LPH\Desktop\pythoncrashcourse配套资源\ehmatthes-pcc-6bfeca0\chapter_16\sitka_weather_07-2014.csv'

#调用csv.reader(),把前面存储的文件对象f作为参数传递给它,并创建一个与文件相关的阅读器对象
#模块csv包含函数next(),调用它并将阅读器对象f传递给它,它将返回文件中下一行。
#下面得到的是文件的第一行。
with open(filename) as f:
    reader=csv.reader(f)
    header_row=next(reader)
    print(header_row)

csv python 解析 python分析csv文件_阅读器_02

从输出的文件头看出,文件每一行的第一个位置日期,第二个位置表示最高华氏气温,第三个位置表示最低华氏气温等。

打印头文件及其位置

with open(filename) as f:
    reader=csv.reader(f)
    header_row=next(reader)
    
    for index,column_hesder in enumerate(header_row):
        print(index,column_hesder)

csv python 解析 python分析csv文件_python_03

发现日期和最高气温分别存储在第0列和第一列,其索引为0和1

模块datetime

在CSV文件中有日期就要使用datetime这个模块来进行正确读取。

from datetime import datetime
firstdate=datetime.strptime('2014-7-1','%Y-%m-%d')
print(firstdate)

strptime方法将包含所需日期的字符串作为第一个实参。第二个实参告诉python如何设置日期的格式。

模块datetime中设置日期和时间格式的实参

实参

含义

%A

星期的名称,如Monday

%B

月份名,如January

%m

用数字表示的月份(01-12)

%d

用数字表示月份中的一天(01-31)

%Y

四位的年份,如2015

%y

两位的年份,如15

%H

24小时制的小时数(00-23)

%I

12小时制的小时数(00-12)

%p

am或pm

%M

分钟数(00-59)

%S

秒数(00-61)

提取并读取数据

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename=r'C:\Users\LPH\Desktop\pythoncrashcourse配套资源\ehmatthes-pcc-6bfeca0\chapter_16\sitka_weather_07-2014.csv'

#调用csv.reader(),把前面存储的文件对象f作为参数传递给它,并创建一个与文件相关的阅读器对象next
#模块csv包含函数next(),调用它并将阅读器对象f传递给它,它将返回文件中下一行。
#下面得到的是文件的第一行。
with open(filename) as f:
    reader=csv.reader(f)
    header_row=next(reader)
    
    dates,highs,lows=[],[],[]
    for row in reader:
        date=datetime.strptime(row[0],'%Y-%m-%d')
        high=int(row[1])
        low=int(row[3])
        
        dates.append(date)
        highs.append(high)
        lows.append(low)
print(dates)       
fig=plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red',alpha=0.5)
plt.plot(dates,lows,c='blue',alpha=0.5)
#填充二者之间的区域
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)

plt.title('Daily high and low temperature - 2014',fontsize=24)
plt.xlabel('',fontsize=12)
#绘制斜的日期标签,以免彼此重叠。
fig.autofmt_xdate()
plt.ylabel('Temperature(F)',fontsize=10)
plt.tick_params(axis='both',labelsize=12)

#修改坐标的标注
x_ticks=dates[::3]
plt.xticks(x_ticks)
y_ticks=list(range(45,75,5))
plt.yticks(y_ticks)

plt.show()

效果如图所示:

csv python 解析 python分析csv文件_csv python 解析_04

拉长时间线(分析整年)

找到某地区一年的气温CSV数据,执行上述程序,发现出现了错误。

csv python 解析 python分析csv文件_csv python 解析_05

无法读取某一天的最高气温,回看文件发现2014-2-16这一天的气温数据都是空

csv python 解析 python分析csv文件_python_06

因此要进行空数据判断。可以使用try-except-else语句。

with open(filename) as f:
    reader=csv.reader(f)
    header_row=next(reader)
    
    dates,highs,lows=[],[],[]
    for row in reader:
        try:
            date=datetime.strptime(row[0],'%Y-%m-%d')
            high=int(row[1])
            low=int(row[3])
        except:
            print(date,'missing date')
        else:
            dates.append(date)
            highs.append(high)
            lows.append(low)

完整代码如下:

import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename=r'C:\Users\LPH\Desktop\pythoncrashcourse配套资源\ehmatthes-pcc-6bfeca0\chapter_16\death_valley_2014.csv'

#调用csv.reader(),把前面存储的文件对象f作为参数传递给它,并创建一个与文件相关的阅读器对象next
#模块csv包含函数next(),调用它并将阅读器对象f传递给它,它将返回文件中下一行。
#下面得到的是文件的第一行。
with open(filename) as f:
    reader=csv.reader(f)
    header_row=next(reader)
    
    dates,highs,lows=[],[],[]
    for row in reader:
        try:
            date=datetime.strptime(row[0],'%Y-%m-%d')
            high=int(row[1])
            low=int(row[3])
        except:
            print(date,'missing date')
        else:
            dates.append(date)
            highs.append(high)
            lows.append(low)
            
print(dates)       
fig=plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red',alpha=0.5)
plt.plot(dates,lows,c='blue',alpha=0.5)
#填充二者之间的区域
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)

plt.title('Daily high and low temperature - 2014\nDeath Valley,CA',fontsize=24)
plt.xlabel('',fontsize=12)
#绘制斜的日期标签,以免彼此重叠。
fig.autofmt_xdate()
plt.ylabel('Temperature(F)',fontsize=10)
plt.tick_params(axis='both',labelsize=12)

#修改坐标的标注
y_ticks=list(range(20,120,5))
plt.yticks(y_ticks)

plt.show()

csv python 解析 python分析csv文件_csv python 解析_07