Pandas实战练习01_20200914

实战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作为刻度值出问题的时候可以采用作为坐标轴刻度标签来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Narutolxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值