美文网首页
21 Pandas怎样快捷方便的处理日期数据

21 Pandas怎样快捷方便的处理日期数据

作者: Viterbi | 来源:发表于2022-11-11 11:58 被阅读0次

    21 Pandas怎样快捷方便的处理日期数据

    Pandas日期处理的作用:将2018-01-01、1/1/2018等多种日期格式映射成统一的格式对象,在该对象上提供强大的功能支持

    几个概念:

    1. pd.to_datetime:pandas的一个函数,能将字符串、列表、series变成日期形式
    2. Timestamp:pandas表示日期的对象形式
    3. DatetimeIndex:pandas表示日期的对象列表形式

    其中:

    • DatetimeIndex是Timestamp的列表形式
    • pd.to_datetime对单个日期字符串处理会得到Timestamp
    • pd.to_datetime对日期字符串列表处理会得到DatetimeIndex

    问题:怎样统计每周、每月、每季度的最高温度?

    1、读取天气数据到dataframe

    import pandas as pd
    %matplotlib inline
    
    fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
    df = pd.read_csv(fpath)
    # 替换掉温度的后缀℃
    df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
    df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
    df.head()
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
    0 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
    1 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
    2 2018-01-03 2 -5 多云 北风 1-2级 28 1
    3 2018-01-04 0 -8 东北风 1-2级 28 1
    4 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1

    2、将日期列转换成pandas的日期

    df.set_index(pd.to_datetime(df["ymd"]), inplace=True)
    
    df.head()
    
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
    ymd
    2018-01-01 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
    2018-01-02 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
    2018-01-03 2018-01-03 2 -5 多云 北风 1-2级 28 1
    2018-01-04 2018-01-04 0 -8 东北风 1-2级 28 1
    2018-01-05 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1
    df.index
    
    
    
        DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
                       '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08',
                       '2018-01-09', '2018-01-10',
                       ...
                       '2018-12-22', '2018-12-23', '2018-12-24', '2018-12-25',
                       '2018-12-26', '2018-12-27', '2018-12-28', '2018-12-29',
                       '2018-12-30', '2018-12-31'],
                      dtype='datetime64[ns]', name='ymd', length=365, freq=None)
    
    
    
    
    # DatetimeIndex是Timestamp的列表形式
    df.index[0]
    
    
    
        Timestamp('2018-01-01 00:00:00')
    

    3、 方便的对DatetimeIndex进行查询

    # 筛选固定的某一天
    df.loc['2018-01-05']
    
    
    
    
        ymd          2018-01-05
        bWendu                3
        yWendu               -6
        tianqi             多云~晴
        fengxiang           西北风
        fengli             1-2级
        aqi                  50
        aqiInfo               优
        aqiLevel              1
        Name: 2018-01-05 00:00:00, dtype: object
    
    
    # 日期区间
    df.loc['2018-01-05':'2018-01-10']
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
    ymd
    2018-01-05 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1
    2018-01-06 2018-01-06 2 -5 多云~阴 西南风 1-2级 32 1
    2018-01-07 2018-01-07 2 -4 阴~多云 西南风 1-2级 59 2
    2018-01-08 2018-01-08 2 -6 西北风 4-5级 50 1
    2018-01-09 2018-01-09 1 -8 西北风 3-4级 34 1
    2018-01-10 2018-01-10 -2 -10 西北风 1-2级 26 1
    # 按月份前缀筛选
    df.loc['2018-03']
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
    ymd
    2018-03-01 2018-03-01 8 -3 多云 西南风 1-2级 46 1
    2018-03-02 2018-03-02 9 -1 晴~多云 北风 1-2级 95 2
    2018-03-03 2018-03-03 13 3 多云~阴 北风 1-2级 214 重度污染 5
    2018-03-04 2018-03-04 7 -2 阴~多云 东南风 1-2级 144 轻度污染 3
    2018-03-05 2018-03-05 8 -3 南风 1-2级 94 2
    2018-03-06 2018-03-06 6 -3 多云~阴 东南风 3-4级 67 2
    2018-03-07 2018-03-07 6 -2 阴~多云 北风 1-2级 65 2
    2018-03-08 2018-03-08 8 -4 东北风 1-2级 62 2
    2018-03-09 2018-03-09 10 -2 多云 西南风 1-2级 132 轻度污染 3
    2018-03-10 2018-03-10 14 -2 东南风 1-2级 171 中度污染 4
    2018-03-11 2018-03-11 11 0 多云 南风 1-2级 81 2
    2018-03-12 2018-03-12 15 3 多云~晴 南风 1-2级 174 中度污染 4
    2018-03-13 2018-03-13 17 5 晴~多云 南风 1-2级 287 重度污染 5
    2018-03-14 2018-03-14 15 6 多云~阴 东北风 1-2级 293 重度污染 5
    2018-03-15 2018-03-15 12 -1 多云~晴 东北风 3-4级 70 2
    2018-03-16 2018-03-16 10 -1 多云 南风 1-2级 58 2
    2018-03-17 2018-03-17 4 0 小雨~阴 南风 1-2级 81 2
    2018-03-18 2018-03-18 13 1 多云~晴 西南风 1-2级 134 轻度污染 3
    2018-03-19 2018-03-19 13 2 多云 东风 1-2级 107 轻度污染 3
    2018-03-20 2018-03-20 10 -2 多云 南风 1-2级 41 1
    2018-03-21 2018-03-21 11 1 多云 西南风 1-2级 76 2
    2018-03-22 2018-03-22 17 4 晴~多云 西南风 1-2级 112 轻度污染 3
    2018-03-23 2018-03-23 18 5 多云 北风 1-2级 146 轻度污染 3
    2018-03-24 2018-03-24 22 5 西南风 1-2级 119 轻度污染 3
    2018-03-25 2018-03-25 24 7 南风 1-2级 78 2
    2018-03-26 2018-03-26 25 7 多云 西南风 1-2级 151 中度污染 4
    2018-03-27 2018-03-27 27 11 南风 1-2级 243 重度污染 5
    2018-03-28 2018-03-28 25 9 多云~晴 东风 1-2级 387 严重污染 6
    2018-03-29 2018-03-29 19 7 南风 1-2级 119 轻度污染 3
    2018-03-30 2018-03-30 18 8 多云 南风 1-2级 68 2
    2018-03-31 2018-03-31 23 9 多云~晴 南风 1-2级 125 轻度污染 3
    # 按月份前缀筛选
    df.loc["2018-07":"2018-09"].index
    
    
        DatetimeIndex(['2018-07-01', '2018-07-02', '2018-07-03', '2018-07-04',
                       '2018-07-05', '2018-07-06', '2018-07-07', '2018-07-08',
                       '2018-07-09', '2018-07-10', '2018-07-11', '2018-07-12',
                       '2018-07-13', '2018-07-14', '2018-07-15', '2018-07-16',
                       '2018-07-17', '2018-07-18', '2018-07-19', '2018-07-20',
                       '2018-07-21', '2018-07-22', '2018-07-23', '2018-07-24',
                       '2018-07-25', '2018-07-26', '2018-07-27', '2018-07-28',
                       '2018-07-29', '2018-07-30', '2018-07-31', '2018-08-01',
                       '2018-08-02', '2018-08-03', '2018-08-04', '2018-08-05',
                       '2018-08-06', '2018-08-07', '2018-08-08', '2018-08-09',
                       '2018-08-10', '2018-08-11', '2018-08-12', '2018-08-13',
                       '2018-08-14', '2018-08-15', '2018-08-16', '2018-08-17',
                       '2018-08-18', '2018-08-19', '2018-08-20', '2018-08-21',
                       '2018-08-22', '2018-08-23', '2018-08-24', '2018-08-25',
                       '2018-08-26', '2018-08-27', '2018-08-28', '2018-08-29',
                       '2018-08-30', '2018-08-31', '2018-09-01', '2018-09-02',
                       '2018-09-03', '2018-09-04', '2018-09-05', '2018-09-06',
                       '2018-09-07', '2018-09-08', '2018-09-09', '2018-09-10',
                       '2018-09-11', '2018-09-12', '2018-09-13', '2018-09-14',
                       '2018-09-15', '2018-09-16', '2018-09-17', '2018-09-18',
                       '2018-09-19', '2018-09-20', '2018-09-21', '2018-09-22',
                       '2018-09-23', '2018-09-24', '2018-09-25', '2018-09-26',
                       '2018-09-27', '2018-09-28', '2018-09-29', '2018-09-30'],
                      dtype='datetime64[ns]', name='ymd', freq=None)
    
    
    
    # 按年份前缀筛选
    df.loc["2018"].head()
    
    .dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
    ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
    ymd
    2018-01-01 2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
    2018-01-02 2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
    2018-01-03 2018-01-03 2 -5 多云 北风 1-2级 28 1
    2018-01-04 2018-01-04 0 -8 东北风 1-2级 28 1
    2018-01-05 2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1

    4、方便的获取周、月、季度

    Timestamp、DatetimeIndex支持大量的属性可以获取日期分量: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#time-date-components

    # 周数字列表
    df.index.week
    
    
        Int64Index([ 1,  1,  1,  1,  1,  1,  1,  2,  2,  2,
                    ...
                    51, 51, 52, 52, 52, 52, 52, 52, 52,  1],
                   dtype='int64', name='ymd', length=365)
    
    
    
    # 月数字列表
    df.index.month
    
    
        Int64Index([ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
                    ...
                    12, 12, 12, 12, 12, 12, 12, 12, 12, 12],
                   dtype='int64', name='ymd', length=365)
    
    
    # 季度数字列表
    df.index.quarter
    
    
    
    
        Int64Index([1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                    ...
                    4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
                   dtype='int64', name='ymd', length=365)
    
    

    5、统计每周、每月、每个季度的最高温度

    统计每周的数据

    df.groupby(df.index.week)["bWendu"].max().head()
    
    
    
        ymd
        1    3
        2    6
        3    7
        4   -1
        5    4
        Name: bWendu, dtype: int32
    
    
    
    df.groupby(df.index.week)["bWendu"].max().plot()
    
    
    
    
        <matplotlib.axes._subplots.AxesSubplot at 0x23300b75b88>
    

    统计每个月的数据

    df.groupby(df.index.month)["bWendu"].max()
    
    
    
        ymd
        1      7
        2     12
        3     27
        4     30
        5     35
        6     38
        7     37
        8     36
        9     31
        10    25
        11    18
        12    10
        Name: bWendu, dtype: int32
    
    
    df.groupby(df.index.month)["bWendu"].max().plot()
    
    
    
    
        <matplotlib.axes._subplots.AxesSubplot at 0x23302dac4c8>
    

    统计每个季度的数据

    df.groupby(df.index.quarter)["bWendu"].max()
    
    ymd
    1    27
    2    38
    3    37
    4    25
    Name: bWendu, dtype: int32
    
    df.groupby(df.index.quarter)["bWendu"].max().plot()
    
    
        <matplotlib.axes._subplots.AxesSubplot at 0x23302e338c8>
    
    

    本文使用 文章同步助手 同步

    相关文章

      网友评论

          本文标题:21 Pandas怎样快捷方便的处理日期数据

          本文链接:https://www.haomeiwen.com/subject/yyeltdtx.html