实战1
北上广深与沈阳5个城市空气质量数据,绘制出北京的PM2.5随时间的变化情况…/PM2.5/BeijingPM20100101_20151231.csv
代码
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/9/14 10:03
#@Author : GodSpeed
#@File : Pandas实战02_01.py
#@Software : PyCharm
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
'''
实战1
北上广深与沈阳5个城市空气质量数据,绘制出北京的PM2.5随时间的变化情况
../PM2.5/BeijingPM20100101_20151231.csv
'''
font = {
'family' : 'simhei',
'weight' : 'bold',
'size' : '12'
}
plt.rc('font', **font)
#方法一: pd.PeriodIndex()来整合时间列
def mothod01():
#1.打开文件
bj_PM2_5data = pd.read_csv(r'PM2.5/BeijingPM20100101_20151231.csv')
#2.观察数据
# 2.1 根据需求来定位目标列
# 本需求:北京的PM2.5随时间的变化情况
# 分析得出相关列:时间('year' 'month' 'day' 'hour')
# PM2.5参数选择确实值比较少的(PM_US Post 50387NotNull)
print(bj_PM2_5data.head())
print(bj_PM2_5data.info())
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 52584 entries, 0 to 52583
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 No 52584 non-null int64
1 year 52584 non-null int64
2 month 52584 non-null int64
3 day 52584 non-null int64
4 hour 52584 non-null int64
5 season 52584 non-null int64
6 PM_Dongsi 25052 non-null float64
7 PM_Dongsihuan 20508 non-null float64
8 PM_Nongzhanguan 24931 non-null float64
9 PM_US Post 50387 non-null float64
10 DEWP 52579 non-null float64
11 HUMI 52245 non-null float64
12 PRES 52245 non-null float64
13 TEMP 52579 non-null float64
14 cbwd 52579 non-null object
15 Iws 52579 non-null float64
16 precipitation 52100 non-null float64
17 Iprec 52100 non-null float64
dtypes: float64(11), int64(6), object(1)
memory usage: 7.0+ MB
None
'''
print(bj_PM2_5data.columns.values)
'''
['No' 'year' 'month' 'day' 'hour' 'season' 'PM_Dongsi' 'PM_Dongsihuan'
'PM_Nongzhanguan' 'PM_US Post' 'DEWP' 'HUMI' 'PRES' 'TEMP' 'cbwd' 'Iws'
'precipitation' 'Iprec']
'''
#数据存在的问题:
#1.时间被分为四列,把时间信息进行整合
#2.数据列PM_US Post存在缺失值,但是根据题意仅仅是统计count(),因此可以忽略
#pd.PeriodIndex()参数:一个时间段Period
date = pd.PeriodIndex(year=bj_PM2_5data["year"],month=bj_PM2_5data["month"],day=bj_PM2_5data['day'],freq="D")
bj_PM2_5data['Date']=date
print(bj_PM2_5data)
print(bj_PM2_5data['Date'].dtypes) #bj_PM2_5data['Date']
# 时间列设置为时间索引
bj_PM2_5data.set_index("Date",inplace=True)
print(bj_PM2_5data)
# 重采样---降采样
bj_PM2_5data_resam = bj_PM2_5data.resample("7D").mean()['PM_US Post']
print(bj_PM2_5data_resam)
# 绘制折线图
#plt.plot(bj_PM2_5data_resam.index,bj_PM2_5data_resam.values)
#PeriodIndex 不能作为索引
#TypeError: float() argument must be a string or a number, not 'Period'
#设置刻度
'''
解决方法:range(len(bj_PM2_5data_resam.index))作为刻度,
bj_PM2_5data_resam.index作为标签
'''
plt.xticks(range(0,len(bj_PM2_5data_resam.index),15),bj_PM2_5data_resam.index[::15],rotation=45)
plt.plot(range(len(bj_PM2_5data_resam.index)),bj_PM2_5data_resam.values)
plt.grid()
plt.title('PM2.5随时间的变化情况')
plt.show()
#方法二: pd.to_datetime来整合时间列
def mothod02():
#1.打开文件
bj_PM2_5data = pd.read_csv(r'PM2.5/BeijingPM20100101_20151231.csv')
bj_PM2_5data['Date']=pd.to_datetime(bj_PM2_5data[['year','month','day']])
# 时间列设置为时间索引
bj_PM2_5data.set_index("Date",inplace=True)
# 重采样---降采样
bj_PM2_5data_resam = bj_PM2_5data.resample("7D").mean()['PM_US Post']
# 绘制折线图
#设置刻度
print(bj_PM2_5data_resam.index)
x_t = [i.strftime("%Y-%m-%d") for i in bj_PM2_5data_resam.index]
plt.xticks(range(0,len(bj_PM2_5data_resam.index),15),x_t[::15],rotation=45)
plt.plot(range(len(bj_PM2_5data_resam.index)),bj_PM2_5data_resam.values)
plt.grid()
plt.title('PM2.5随时间的变化情况')
plt.show()
if __name__ == '__main__':
mothod01()
mothod02()
结果
总结收获: 1.解决时间列分离的处理方法pd.PeriodIndex或pd.to_datetime; 2.当PeriodIndex和to_datetime作为刻度值出问题的时候可以采用作为坐标轴刻度标签来解决。 |