【pandas】教程:9-如何轻松处理时间序列数据

news2025/1/18 7:26:20

Pandas 如何轻松处理时间序列数据

数据

本节使用的数据为 data/air_quality_no2_long.csv,链接为 pandas案例和教程所使用的数据-机器学习文档类资源-CSDN文库

在这里插入图片描述

import pandas as pd 
import matplotlib.pyplot as plt

air_quality = pd.read_csv("data/air_quality_no2_long.csv")
# 重命名列名
air_quality = air_quality.rename(columns={"date.utc": "datetime"})
air_quality
        city country                   datetime            location parameter  \
0      Paris      FR  2019-06-21 00:00:00+00:00             FR04014       no2   
1      Paris      FR  2019-06-20 23:00:00+00:00             FR04014       no2   
2      Paris      FR  2019-06-20 22:00:00+00:00             FR04014       no2   
3      Paris      FR  2019-06-20 21:00:00+00:00             FR04014       no2   
4      Paris      FR  2019-06-20 20:00:00+00:00             FR04014       no2   
...      ...     ...                        ...                 ...       ...   
2063  London      GB  2019-05-07 06:00:00+00:00  London Westminster       no2   
2064  London      GB  2019-05-07 04:00:00+00:00  London Westminster       no2   
2065  London      GB  2019-05-07 03:00:00+00:00  London Westminster       no2   
2066  London      GB  2019-05-07 02:00:00+00:00  London Westminster       no2   
2067  London      GB  2019-05-07 01:00:00+00:00  London Westminster       no2   

      value   unit  
0      20.0  µg/m³  
1      21.8  µg/m³  
2      26.5  µg/m³  
3      24.9  µg/m³  
4      21.4  µg/m³  
...     ...    ...  
2063   26.0  µg/m³  
2064   16.0  µg/m³  
2065   19.0  µg/m³  
2066   19.0  µg/m³  
2067   23.0  µg/m³  

[2068 rows x 7 columns]

利用 pandas 的 datetime 属性

  • 将 文本型的数据转换为 datetime
air_quality["datetime"] = pd.to_datetime(air_quality["datetime"])
air_quality["datetime"]
0      2019-06-21 00:00:00+00:00
1      2019-06-20 23:00:00+00:00
2      2019-06-20 22:00:00+00:00
3      2019-06-20 21:00:00+00:00
4      2019-06-20 20:00:00+00:00
                  ...         
2063   2019-05-07 06:00:00+00:00
2064   2019-05-07 04:00:00+00:00
2065   2019-05-07 03:00:00+00:00
2066   2019-05-07 02:00:00+00:00
2067   2019-05-07 01:00:00+00:00
Name: datetime, Length: 2068, dtype: datetime64[ns, UTC]

利用 to_datetime 函数可以将 string 类型的时间变量 转换为 datetime64[ns, UTC] 对象。
pd.read_csv("data/air_quality_no2_long.csv", parse_dates=["datetime"]) 可以在读入数据的时候,直接将日期时间数据转换为 datetime64[ns, UTC] 对象。

为什么需要 datetime ?

  1. 可以计算开始时间和结束时间
  2. 可以计算时间间隔
  3. 可以进行时间比较等等。
air_quality["datetime"].min(), air_quality["datetime"].max()
(Timestamp('2019-05-07 01:00:00+0000', tz='UTC'),
 Timestamp('2019-06-21 00:00:00+0000', tz='UTC'))
air_quality["datetime"].max() - air_quality["datetime"].min()
Timedelta('44 days 23:00:00')
  • 将数据中的月份单独作为数据 DataFrame 的一列。
air_quality["month"] = air_quality["datetime"].dt.month
air_quality.head()
    city country                  datetime location parameter  value   unit  \
0  Paris      FR 2019-06-21 00:00:00+00:00  FR04014       no2   20.0  µg/m³   
1  Paris      FR 2019-06-20 23:00:00+00:00  FR04014       no2   21.8  µg/m³   
2  Paris      FR 2019-06-20 22:00:00+00:00  FR04014       no2   26.5  µg/m³   
3  Paris      FR 2019-06-20 21:00:00+00:00  FR04014       no2   24.9  µg/m³   
4  Paris      FR 2019-06-20 20:00:00+00:00  FR04014       no2   21.4  µg/m³   

   month  
0      6  
1      6  
2      6  
3      6  
4      6 

Timestamp 对象有很多属性可以使用,除了 month, 还可以用 year, weekofyear, quarter …,这些都可以通过 dt 访问器来访问。

  • 如何计算每个地区周一到周日每天平均 N O 2 NO_2 NO2浓度?
air_quality.groupby([air_quality["datetime"].dt.weekday, "location"])["value"].mean()
datetime  location        
0         BETR801               27.875000
          FR04014               24.856250
          London Westminster    23.969697
1         BETR801               22.214286
          FR04014               30.999359
          London Westminster    24.885714
2         BETR801               21.125000
          FR04014               29.165753
          London Westminster    23.460432
3         BETR801               27.500000
          FR04014               28.600690
          London Westminster    24.780142
4         BETR801               28.400000
          FR04014               31.617986
          London Westminster    26.446809
5         BETR801               33.500000
          FR04014               25.266154
          London Westminster    24.977612
6         BETR801               21.896552
          FR04014               23.274306
          London Westminster    24.859155
Name: value, dtype: float64

还记得 groupby 提供的 split-apply-combine 模式吗?
我们这里需要计算每个测量区域的周一到周日总体平均浓度。
首先将周一到周日每天分组(groupMonday=0, Sunday=6weekday 通过 dt 访问,
然后按地区分组(group),分别计算平均值,然后组合。
由于我们在这些例子中使用的是非常短的时间序列,因此分析并不能提供具有长期代表性的结果!

  • 绘制一天中每个小时的 N O 2 NO_2 NO2 平均浓度
fig, axs = plt.subplots(figsize=(12, 4))
air_quality.groupby(air_quality["datetime"].dt.hour)["value"].mean().plot(
    kind='bar', rot=0, ax=axs)
plt.xlabel("Hour of the day")  # custom x label using Matplotlib
plt.ylabel("$NO_2 (µg/m^3)$")

在这里插入图片描述

Datetime 作为索引

在 (1条消息) 【pandas】教程:7-调整表格数据的布局_黄金旺铺的博客-CSDN博客 中提到了 pivot 可以改变表格的形状,将每个地区做为单独的一列。
通过pivot 数据,datetime 变成了表格的索引,通常情况下,设置一列为索引可以通过 set_index 函数实现。

no_2 = air_quality.pivot(index="datetime", columns="location", values="value")
no_2
location                   BETR801  FR04014  London Westminster
datetime                                                       
2019-05-07 01:00:00+00:00     50.5     25.0                23.0
2019-05-07 02:00:00+00:00     45.0     27.7                19.0
2019-05-07 03:00:00+00:00      NaN     50.4                19.0
2019-05-07 04:00:00+00:00      NaN     61.9                16.0
2019-05-07 05:00:00+00:00      NaN     72.4                 NaN
...                            ...      ...                 ...
2019-06-20 20:00:00+00:00      NaN     21.4                 NaN
2019-06-20 21:00:00+00:00      NaN     24.9                 NaN
2019-06-20 22:00:00+00:00      NaN     26.5                 NaN
2019-06-20 23:00:00+00:00      NaN     21.8                 NaN
2019-06-21 00:00:00+00:00      NaN     20.0                 NaN

[1033 rows x 3 columns]

datetime 提供了强大的 index 功能,例如,我们不需要 dt 来获取时间序列的属性,可以直接使用 index 获得这些属性;

no_2.index.year, no_2.index.weekday
(Int64Index([2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
             ...
             2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019],
            dtype='int64', name='datetime', length=1033),
 Int64Index([1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
             ...
             3, 3, 3, 3, 3, 3, 3, 3, 3, 4],
            dtype='int64', name='datetime', length=1033))
  • 绘制 5月20日 到 5月21日 不同地区的 N O 2 NO_2 NO2 浓度值
no_2["2019-05-20":"2019-05-21"].plot()

在这里插入图片描述

将时间序列重新采样另一个频率

  • 将当前每小时的时间序列采样值聚合到每个站点的月最大值;
monthly_max = no_2.resample("M").max()
monthly_max
location                   BETR801  FR04014  London Westminster
datetime                                                       
2019-05-31 00:00:00+00:00     74.5     97.0                97.0
2019-06-30 00:00:00+00:00     52.5     84.7                52.0

在时间序列上一个非常强大的方法是 datetimeindex 可以通过 resample 时间序列到不同频率(例如:将每秒的数据转换为每五分钟的数据)
resample 有点类似于 groupby 操作;
提供了基于时间的 grouping , 可以利用字符串 (例如:M, 5H …)
需要提供聚合函数 mean, max

  • 绘制每个地区日均 N O 2 NO_2 NO2 浓度
no_2.resample("D").mean().plot(style="-o", figsize=(12, 4))

在这里插入图片描述

记住

有效的日期字符串可以使用 to_datetime 转换为 datetime 对象,也可以在读入数据时直接转换为 datetime 对象。
pandas 里的 datetime 对象支持计算和逻辑运算等,还可以方便的使用 dt 访问时间的属性。
DatetimeIndex 包含了日期时间相关的属性,并支持方便的切片。
resample 是一个非常强大的方法,支持时间序列的采样频率变换。

参考

How to handle time series data with ease? — pandas 1.5.2 documentation (pydata.org)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战字节码-01-基础知识

开篇字节码是什么、做什么这类问题不在这里赘述,《实战字节码》系列旨在帮助没接触过字节码的人能够快速上手做应用开发,并构建字节码技术的知识骨架,所以不会系统地介绍字节码技术的方方面面,也尽量避免叙述理论和概念相关的东西…

【笔记:模拟CMOS集成电路】噪声——基本电路噪声性能(2)

【笔记:模拟CMOS集成电路】噪声——基本电路噪声性能(2)前言1 噪声——分析基础2 噪声——基本电路噪声性能2.1 MOS管噪声模型(1)电阻RG热噪声和沟道热噪声(2)衬底电阻热噪声(3)源极寄生电阻RS热噪声2.2常见组态的单级放大器噪声分析2.2.1 CS…

Python电影观众数量回归分析 随机森林 可视化 实验报告

实验报告:Python电影观众数量回归分析随机森林可视化-数据挖掘文档类资源-CSDN文库 前言 随着经济的发展和人民日益增长的美好生活需要的显著提升,看电影成为了人民群众在闲暇时光娱乐的重要途径。面对百花齐放的电影产业,哪些电影更能带动市…

OpenGL期末大作业——模拟太阳系(免费开源)

目录 一、项目介绍 二、配置与运行 三、项目地址 一、项目介绍 这是一个综合的openGL场景,模拟太阳系。场景中有光照,纹理等,并有丰富的视角控制,UI交互,比如WASD/IJKL键控制视角的移动等等。一个太阳系的场景&#…

大数据基础平台搭建-(五)Hive搭建

大数据基础平台搭建-(五)Hive搭建 大数据平台系列文章: 1、大数据基础平台搭建-(一)基础环境准备 2、大数据基础平台搭建-(二)Hadoop集群搭建 3、大数据基础平台搭建-(三&#xff09…

Android今日头条平台隐私合规整改

头条应用管理平台开发者合规指引:https://open.oceanengine.com/labels/7/docs/1730079845340164头条审核合规的app,需要具备以下条件:用户协议弹窗抖音隐私政策(模板示例):https://sf3-cdn-tos.douyinstat…

别告诉我你只知道waitnotify,不知道parkunpark???

目录 park&unpark wait,notify 和 park,unpark的区别 park unpark 原理 先调用park的情况 先调用park,在调用unpark的情况 先调用unpark,在调用park的情况 park&unpark park和unpark都是LockSupport的方法,park用于暂停当前线程的运行,而unpark用于恢复该线程的…

服务机器人“众生相”

在多种因素的共同作用下,早年间经常出现在科幻片中的机器人已然穿越荧屏来到了现实世界,为人们的日常生活增添了几分便利。比如,在家庭场景中,扫地机器人帮助人们解放双手;在餐饮场景中,送餐机器人为顾客提…

C语言--探索函数栈帧的创建与销毁

目录 为main函数开辟栈帧 创建变量 传参 为自定义函数开辟栈帧 返回 局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?形参与实参的关系?函数怎么调用与返回? 我们用VS2013的环境进行探索…

Https为什么比Http安全?

Https是在Http之上做了一层加密和认证; 主要的区别是Https在TLS层对常规的Http请求和响应进行加密,同时对这些请求和响应进行数字签名。 Http请求的样式: 明文传输,通过抓包工具可以抓到 GET /hello.txt HTTP/1.1 User-Agent: c…

【三】Netty 解决粘包和拆包问题

netty 解决粘包和拆包问题TCP 粘包/拆包的基础知识粘包和拆包的问题说明TCP粘包/拆包 原因粘包和拆包的解决策略tcp 粘包/拆包 的问题案例大致流程如图:代码展示(jdk1.7)TimeServer 服务端启动类TimeServerHandler 服务端业务处理类TimeClient 客户端启动类TimeClientHandler 客…

Python入门注释和变量(2)

1.1输入 a input("请输入内容") print("您输入的内容是:{}".format(a)) 输入的内容会帮我们转换成字符串形式 2.1运算符 2.1.1算数运算符 以a 10 , b 20 为例进行运算 运算符描述实例加两个对象相加ab输出结果30-减得到负数或是一个数减…

You辉编程_有关boot

一、SpringBoot多环境配置 1.环境的配置信息 (1)application.properties #指定默认使用dev的配置 spring.profiles.activedev (2)application-dev.properties #开发环境 server.port8080 branchdev (3)application-prod.properties #测试环境 server.port8081 branchtest2…

【Nacos】Nacos介绍和简单使用

Nacos介绍及简单使用 Nacos介绍 Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供了注册中心、配置中心和动态DNS服务三大功能。能够无缝对接SpringCloud、Spring、Dubbo等流行框架。 …

环境搭建 | MuMu模拟器 - Window10/11 系列

🖥️ 环境搭建 专栏:MuMu模拟器 - Window10/11 系列 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ …

FLV格式分析

1.FLV封装格式简介 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积小、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤ FLV格式封装的⽂件后缀为.flv。 2.FLV封装格式分析 FLV封装格…

视频监视计划和设计软件丨IP Video System Design Tool功能简介

本软件提供快速轻松地设计现代视频监视系统之新方式 产品功能 • 降低寻找更好的视频摄像机位置的成本时,增加您的安全系统效能。 • 极短时间内,即可计算出精确的摄像机镜头焦距长度与视角。 • 使用2D和3D建模,检查每台摄像机的视野并寻…

新应用——合同管理应用,实现合同无纸化管理

合同管理应用,是建立在低代码技术基础上,结合企业的管理方式,为企业提供决策、计划、控制与经营绩效评估的全方位、系统化的合同管理解决方案。百数合同管理系统应用提供了从合同模板、合同签订、合同收付款和合同发票管理、合同归档&#xf…

我是如何两个月通过软件设计师的!

软设刚过,分享下经验 个人感觉不是很难,我都不好意思说我没怎么复习,本来以后自己要二战了,没想到,成绩还挺惊喜,大概是因为最后几天冲刺到点子上了。 攻略: 搜集资料,搜集考试相…

一、Kubernetes介绍

文章目录1.常见容器编排工具2.kubernetes简介3.kubernetes组件4.kubernetes概念1.常见容器编排工具 Swarm:Docker自己的容器编排工具Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用Kubernetes:Google开源的的容器…