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

打印 上一主题 下一主题

主题 505|帖子 505|积分 1515

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

当收集来的数据中,年月日等信息分散在多个列时,往往需要先合并成日期类型,然后才能做分析处理。
合并多列转换为日期类型,可以直接用 to_datetime函数来处理:
  1. import pandas as pd
  2. df = pd.DataFrame(
  3.     {
  4.         "year": ["2021", "2021",
  5.                  "2022", "2022", "2022"],
  6.         "month": ["1", "3", "4", "4", "6"],
  7.         "day": ["10", "20", "4", "4", "1"],
  8.         "value": [1, 2, 3, 4, 5],
  9.     }
  10. )
  11. df["date"] = pd.to_datetime(
  12.     df[["year", "month", "day"]]
  13. )
  14. df = df.drop(
  15.     columns=["year", "month", "day"]
  16. )
  17. df
复制代码

2. 基于日期的聚合统计

之所以要把列类型转换为日期类型,是因为pandas提供了针对日期类型的非常便利的聚合统计方法。
比如如下连续的日期数据:
  1. df = pd.DataFrame(
  2.     {
  3.         "year": ["2022", "2022", "2023",
  4.                  "2023", "2023"],
  5.         "month": ["12", "12", "1", "1", "1"],
  6.         "day": ["30", "31", "1", "1", "2"],
  7.         "value": [1, 2, 3, 4, 5],
  8.     }
  9. )
  10. df["date"] = pd.to_datetime(
  11.     df[["year", "month", "day"]]
  12. )
  13. df = df.drop(
  14.     columns=["year", "month", "day"]
  15. )
  16. df = df.loc[:, ::-1]
  17. df
复制代码

这里用了之前介绍过的一个小技巧 df.loc[:, ::-1],把date列放在value列之前,对数据处理没有什么影响,只是为了看数据的习惯。
得到转换好的数据之后,可以通过resample函数来聚合统计。
resample是pandas提供的专门用于时间序列数据的聚合统计的。
2.1. 按年统计
  1. ysum = df.resample("Y", on="date").value.sum()
  2. ymean = df.resample("Y", on="date").value.mean()
  3. stat = pd.DataFrame({
  4.     "sum": ysum,
  5.     "mean": ymean,
  6. })
  7. stat
复制代码

示例数据只有两年的,统计后显示的是日期是年末最后一天。
这里为了演示只统计了合计值平均值,实际可以根据情况统计需要的值。
2.2. 按月统计
  1. msum =        df.resample("M", on="date").value.sum()
  2. mmean = df.resample("M", on="date").value.mean()
  3. stat = pd.DataFrame({
  4.     "sum": msum,
  5.     "mean": mmean,
  6. })
  7. stat
复制代码

统计后显示的日期是每个月月末的日期。
2.3. 按日统计
  1. dsum = df.resample("D", on="date").value.sum()
  2. dmean = df.resample("D", on="date").value.mean()
  3. stat = pd.DataFrame({
  4.     "sum": dsum,
  5.     "mean": dmean,
  6. })
  7. stat
复制代码

根据每天的日期统计。
2.4. 按季度统计
  1. qsum = df.resample("Q", on="date").value.sum()
  2. qmean = df.resample("Q", on="date").value.mean()
  3. stat = pd.DataFrame({
  4.     "sum": qsum,
  5.     "mean": qmean,
  6. })
  7. stat
复制代码

统计后显示的日期是每个季度的最后一天。
2.5. 按周统计
  1. wsum = df.resample("W", on="date").value.sum()
  2. wmean = df.resample("W", on="date").value.mean()
  3. stat = pd.DataFrame({
  4.     "sum": wsum,
  5.     "mean": wmean,
  6. })
  7. stat
复制代码

统计后显示的日期是每个周的周日
2.6. 补充

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表