日期处理相关内容之前pandas基础
系列中有一篇专门介绍过,本篇补充两个常用的技巧。
【资料图】
1. 多列合并为日期当收集来的数据中,年月日等信息分散在多个列时,往往需要先合并成日期类型,然后才能做分析处理。合并多列转换为日期类型,可以直接用 to_datetime
函数来处理:
import pandas as pddf = 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
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
这里用了之前介绍过的一个小技巧df.loc[:, ::-1]
,把date
列放在value
列之前,对数据处理没有什么影响,只是为了看数据的习惯。
得到转换好的数据之后,可以通过resample
函数来聚合统计。resample
是pandas
提供的专门用于时间序列数据的聚合统计的。
ysum = df.resample("Y", on="date").value.sum()ymean = df.resample("Y", on="date").value.mean()stat = pd.DataFrame({ "sum": ysum, "mean": ymean,})stat
示例数据只有两年的,统计后显示的是日期是年末最后一天。这里为了演示只统计了合计值和平均值,实际可以根据情况统计需要的值。
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
统计后显示的日期是每个月月末的日期。
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
根据每天的日期统计。
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
统计后显示的日期是每个季度的最后一天。
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
统计后显示的日期是每个周的周日。
2.6. 补充resample
函数支持的统计期间除了上面介绍的常用的年,月,日,周,季度等等,还有很多其他的期间,具体参考:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases
关键词:
版权与免责声明:
1 本网注明“来源:×××”(非商业周刊网)的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,本网不承担此类稿件侵权行为的连带责任。
2 在本网的新闻页面或BBS上进行跟帖或发表言论者,文责自负。
3 相关信息并未经过本网站证实,不对您构成任何投资建议,据此操作,风险自担。
4 如涉及作品内容、版权等其它问题,请在30日内同本网联系。