• 【pandas小技巧】--日期相关处理


    日期处理相关内容之前pandas基础系列中有一篇专门介绍过,本篇补充两个常用的技巧。

    1. 多列合并为日期

    当收集来的数据中,年月日等信息分散在多个列时,往往需要先合并成日期类型,然后才能做分析处理。
    合并多列转换为日期类型,可以直接用 to_datetime函数来处理:

    import pandas as pd
    
    df = pd.DataFrame(
        {
            "year": ["2021", "2021",
                     "2022", "2022", "2022"],
            "month": ["1", "3", "4", "4", "6"],
            "day": ["10", "20", "4", "4", "1"],
            "value": [1, 2, 3, 4, 5],
        }
    )
    
    df["date"] = pd.to_datetime(
        df[["year", "month", "day"]]
    ) 
    df = df.drop(
        columns=["year", "month", "day"]
    )
    df
    

    image.png

    2. 基于日期的聚合统计

    之所以要把列类型转换为日期类型,是因为pandas提供了针对日期类型的非常便利的聚合统计方法。
    比如如下连续的日期数据:

    df = pd.DataFrame(
        {
            "year": ["2022", "2022", "2023",
                     "2023", "2023"],
            "month": ["12", "12", "1", "1", "1"],
            "day": ["30", "31", "1", "1", "2"],
            "value": [1, 2, 3, 4, 5],
        }
    )
    df["date"] = pd.to_datetime(
        df[["year", "month", "day"]]
    ) 
    df = df.drop(
        columns=["year", "month", "day"]
    )
    df = df.loc[:, ::-1]
    df
    

    image.png
    这里用了之前介绍过的一个小技巧 df.loc[:, ::-1],把date列放在value列之前,对数据处理没有什么影响,只是为了看数据的习惯。

    得到转换好的数据之后,可以通过resample函数来聚合统计。
    resamplepandas提供的专门用于时间序列数据的聚合统计的。

    2.1. 按年统计

    ysum = df.resample("Y", on="date").value.sum()
    ymean = df.resample("Y", on="date").value.mean()
    
    stat = pd.DataFrame({
        "sum": ysum,
        "mean": ymean,
    })
    stat
    

    image.png
    示例数据只有两年的,统计后显示的是日期是年末最后一天。
    这里为了演示只统计了合计值平均值,实际可以根据情况统计需要的值。

    2.2. 按月统计

    msum =	df.resample("M", on="date").value.sum()
    mmean = df.resample("M", on="date").value.mean()
    stat = pd.DataFrame({
        "sum": msum,
        "mean": mmean,
    })
    stat
    

    image.png
    统计后显示的日期是每个月月末的日期。

    2.3. 按日统计

    dsum = df.resample("D", on="date").value.sum()
    dmean = df.resample("D", on="date").value.mean()
    stat = pd.DataFrame({
        "sum": dsum,
        "mean": dmean,
    })
    stat
    

    image.png
    根据每天的日期统计。

    2.4. 按季度统计

    qsum = df.resample("Q", on="date").value.sum()
    qmean = df.resample("Q", on="date").value.mean()
    stat = pd.DataFrame({
        "sum": qsum,
        "mean": qmean,
    })
    stat
    

    image.png
    统计后显示的日期是每个季度的最后一天。

    2.5. 按周统计

    wsum = df.resample("W", on="date").value.sum()
    wmean = df.resample("W", on="date").value.mean()
    
    stat = pd.DataFrame({
        "sum": wsum,
        "mean": wmean,
    })
    stat
    

    image.png
    统计后显示的日期是每个周的周日

    2.6. 补充

    resample函数支持的统计期间除了上面介绍的常用的季度等等,还有很多其他的期间,
    具体参考:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases

    image.png

  • 相关阅读:
    【力扣 第 320 场周赛】转化题目 || 动态规划一般经验
    js控制台输出佛祖保佑图形图案/彩色图形图案实例代码
    单链表相关面试题--4.输入一个链表,输出该链表中倒数第k个结点
    排列组合——n个人平均分成m组
    lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
    一文搞懂nginx的反向代理 负载均衡
    C++中关于多线程并发访问实例函数与静态函数
    施密特正交化
    Java Thread类简介说明
    dedecms系统织梦会员登录二级域名不能跨域
  • 原文地址:https://www.cnblogs.com/wang_yb/p/17628030.html