Python数据分析NumPy和pandas(三十五、时间序列数据基础)
时间序列数据是许多不同领域的结构化数据的重要形式,例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的,也就是说,数据点根据某些规则定期出现,例如每 15 秒、每 5 分钟或每月一次。时间序列也可以是不规则的,没有固定的时间单位或单位之间的偏移量。如何标记和引用时间序列数据取决于应用程序,常用的有以下几种标记时间序列的方式:
时间戳(Timestamps):特定的时刻。
固定期间(Fixed periods):例如 2020 年 1 月的整个月,或 2023 年全年。
时间间隔(Intervals of time):由开始和结束时间戳指示。周期可以被认为是间隔的特殊情况。
实验或已用时间(Experiment or elapsed time):每个时间戳都是相对于特定开始时间的时间度量,从 0 开始(例如,饼干放入烤箱后每秒烘烤的直径)。
最简单的时间序列是按 timestamp 索引。pandas 支持基于 timedeltas 的索引,这是表示 experiment 或 elapsed time 的有用方法,可以在 pandas 官方文档中了解更多信息。
pandas 提供了许多内置的时序工具和算法。可以有效地处理大型时间序列,并对不规则和固定频率的时间序列进行切片和切块、聚合和重新采样。其中一些工具对于金融和经济应用程序很有用,也可以使用它们来分析服务器日志数据等。
Python 标准库包括日期和时间数据的数据类型,以及与日历相关的功能。datetime、time 和 calendar 模块实现了主要的基础功能。datetime.datetime 类型(或简称 datetime)使用的非常频繁:
from datetime import datetimenow = datetime.now()
print(now)
print(now.year, now.month, now.day)
now输出当前年月日时分秒毫秒:2024-11-17 11:58:02.773699
now.year, now.month, now.day 输出:2024 11 17
datetime 将日期和时间存储到微秒。datetime.timedelta,或简称 timedelta,表示两个 datetime 对象之间的时间差异:
from datetime import datetimedelta = datetime(2024, 11, 17) - datetime(2023, 9, 1, 8, 15)
print(delta)
print(delta.days, delta.seconds)
delta输出:442 days, 15:45:00
delta.days, delta.seconds 输出:442 56700
上面输出的delta是datetime.timedelta对象,我们可以将 timedelta 或其倍数加(或减)到 datetime 对象中,以产生新的移位对象:
from datetime import datetime, timedeltastart = datetime(2024, 1, 6)
res1 = start + timedelta(12)
res2 = start - 2 * timedelta(12)
print(res1)
print(res2)
res1输出的结果是start日期+12天的日期:2024-01-18 00:00:00
res2输出的结果是start日期-24天的日期:2023-12-13 00:00:00
下图列表是datatime模块中包含的数据类型:

一、String 和 Datetime 类型转换
可以使用 str 或 strftime 方法将 datetime 对象和 pandas Timestamp 对象(稍后将学习)格式化为字符串,并传递字符串格式规范:
from datetime import datetime, timedeltastamp = datetime(2024, 1, 6)
print(str(stamp)) #输出 2024-01-06 00:00:00print(stamp.strftime("%Y-%m-%d")) # 输出 2024-01-06
以下是日期格式规范的列表截图(自己翻译学习使用):

可以使用许多相同的格式代码通过 datetime.strptime 将字符串转换为日期(但某些代码,如 %F,不能使用):
from datetime import datetime, timedeltavalue = "2024-01-06"
print(datetime.strptime(value, "%Y-%m-%d")) # 输出:2024-01-06 00:00:00datestrs = ["7/6/2024", "8/6/2024"]
res = [datetime.strptime(x, "%m/%d/%Y") for x in datestrs]
print(res) # 输出:[datetime.datetime(2024, 7, 6, 0, 0), datetime.datetime(2024, 8, 6, 0, 0)]
pandas 通常面向日期数组使用,无论是用作轴索引还是 DataFrame 中的列。pandas.to_datetime 方法解析许多不同类型的日期表示形式。可以快速解析 ISO 8601 等标准日期格式:
import pandas as pddatestrs = ["2024-07-06 12:00:00", "2024-08-06 00:00:00"]
res = pd.to_datetime(datestrs)
print(res) # 输出:DatetimeIndex(['2024-07-06 12:00:00', '2024-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)# 处理应被视为缺失的值(None、空字符串等):
idx = pd.to_datetime(datestrs + [None])
print(idx) # 输出:DatetimeIndex(['2024-07-06 12:00:00', '2024-08-06 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)print(idx[2]) # 输出:NaTprint(pd.isna(idx)) # 输出:[False False True]
以上代码输出请看相关注释。
NaT (Not a Time) 是 pandas 的时间戳数据的 null 值。下面列表图片是特定于区域设置的日期格式:

二、Time Series Basics
pandas 中的一种基本时间序列对象是由时间戳索引的 Series,它通常在 pandas 之外表示为 Python 字符串或日期时间对象。与其他 Series 一样,具有时间序列索引的Series对象之间的算术运算会自动在日期上对齐。pandas 使用 NumPy 的 datetime64 数据类型以纳秒分辨率存储时间戳。DatetimeIndex 中的标量值是 pandas Timestamp 对象。看如下示例:
import numpy as np
import pandas as pd
from datetime import datetime, timedeltanp.random.seed(12345)dates = [datetime(2024, 1, 2), datetime(2024, 1, 5),datetime(2024, 1, 7), datetime(2024, 1, 8),datetime(2024, 1, 10), datetime(2024, 1, 12)]
ts = pd.Series(np.random.standard_normal(6), index=dates)
print(ts)# 在后台,这些 datetime 对象已被放入 DatetimeIndex 中:
print(ts.index)# 具有时间序列索引的Series对象之间的算术运算会自动在日期上对齐
# ts[::2] 在 ts 中步长为2选择元素。
res = ts + ts[::2]
print(res)# pandas 使用 NumPy 的 datetime64 数据类型以纳秒分辨率存储时间戳
print(ts.index.dtype)# DatetimeIndex 中的标量值是 pandas Timestamp 对象
stamp = ts.index[0]
print(stamp)
Series对象ts输出:

ts.index输出:
DatetimeIndex(['2024-01-02', '2024-01-05', '2024-01-07', '2024-01-08',
'2024-01-10', '2024-01-12'],
dtype='datetime64[ns]', freq=None)
ts + ts[::2] 运算输出:

ts.index.dtype 输出ts的索引数据类型:datetime64[ns]
ts.index[0] 输出第0个索引的值(标量值):2024-01-02 00:00:00
在大多情况下,pandas.Timestamp能够替换datetime对象使用,反之则不然,因为 pandas.Timestamp 可以存储纳秒精度数据,而 datetime 最多只能存储微秒。另外, pandas.Timestamp 可以存储频率信息(如果有)并能进行时区转换和其他类型的操作。
索引、选择、子集(Indexing, Selection, Subsetting)
根据标签为数据编制索引和选择数据时,时间序列的行为与其他序列是相似的:
import numpy as np
import pandas as pd
from datetime import datetime, timedeltanp.random.seed(12345)dates = [datetime(2024, 1, 2), datetime(2024, 1, 5),datetime(2024, 1, 7), datetime(2024, 1, 8),datetime(2024, 1, 10), datetime(2024, 1, 12)]
ts = pd.Series(np.random.standard_normal(6), index=dates)
print(ts)stamp = ts.index[0]
print(ts[stamp])# 为方便起见,可以传递可解释为 date 的字符串
print(ts["2024-01-10"])
ts[stamp]输出:-0.20470765948471295
ts["2024-01-10"]输出:1.9657805725027142
对于较长的时间序列,可以传递一年或仅传递一年和月份来轻松选择数据切片:
import numpy as np
import pandas as pdnp.random.seed(12345)longer_ts = pd.Series(np.random.standard_normal(1000),index=pd.date_range("2022-01-01", periods=1000))
print(longer_ts)
print(longer_ts["2023"])
longer_ts输出:

longer_ts["2023"]输出:

这里,longer_ts["2023"]中字符串 “2023” 被解释为年份并选择该时间段。如果指定月份,这也适用,例如:
import numpy as np
import pandas as pdnp.random.seed(12345)longer_ts = pd.Series(np.random.standard_normal(1000),index=pd.date_range("2022-01-01", periods=1000))
print(longer_ts)
print(longer_ts["2023"])
print(longer_ts["2023-06"])
longer_ts["2023-06"]输出:

使用 datetime 对象进行切片也有用,我们看如下代码示例:
import numpy as np
import pandas as pd
from datetime import datetimenp.random.seed(12345)dates = [datetime(2024, 1, 2), datetime(2024, 1, 5),datetime(2024, 1, 7), datetime(2024, 1, 8),datetime(2024, 1, 10), datetime(2024, 1, 12)]
ts = pd.Series(np.random.standard_normal(6), index=dates)
print(ts)print(ts[datetime(2024, 1, 7):])
print(ts[datetime(2024, 1, 7):datetime(2024, 1, 10)])# 由于大多数时间序列数据是按时间顺序排序的,因此可以使用时间序列中未包含的时间戳进行切片以执行范围查询
# ts时间序列索引未包含值"2024-01-06"和"2024-01-11",下面执行范围查询
print(ts["2024-01-06":"2024-01-11"])
ts输出:

ts[datetime(2024, 1, 7):] 输出:

ts[datetime(2024, 1, 7):datetime(2024, 1, 10)]输出:

ts["2024-01-06":"2024-01-11"] 输出:

与之前一样,可以传递字符串 date、datetime 或 timestamp。请记住,以这种方式进行切片会在源时间序列上生成视图,就像切片 NumPy 数组一样。这意味着不会复制任何数据,并且对切片的修改将反映在原始数据中。
有一个等效的实例方法 truncate,它在两个日期之间对 Series 进行切片:
import numpy as np
import pandas as pd
from datetime import datetimenp.random.seed(12345)dates = [datetime(2024, 1, 2), datetime(2024, 1, 5),datetime(2024, 1, 7), datetime(2024, 1, 8),datetime(2024, 1, 10), datetime(2024, 1, 12)]
ts = pd.Series(np.random.standard_normal(6), index=dates)print(ts.truncate(after="2024-01-09"))
ts.truncate(after="2024-01-09")输出:

以上这些也都适用于 DataFrame,对其行进行索引,还是代码示例来学习:
import numpy as np
import pandas as pdnp.random.seed(12345)dates = pd.date_range("2020-01-01", periods=100, freq="W-WED")
long_df = pd.DataFrame(np.random.standard_normal((100, 4)),index=dates,columns=["Colorado", "Texas","New York", "Ohio"])
print(long_df.loc["2021-05"])
输出结果:
| Colorado | Texas | New York | Ohio | |
|---|---|---|---|---|
| 2021-05-05 | -0.115413 | -0.350745 | 0.044697 | -0.897756 |
| 2021-05-12 | 0.890874 | -1.151185 | -2.612303 | 1.141250 |
| 2021-05-19 | -0.867136 | 0.383583 | -0.437030 | 0.347489 |
| 2021-05-26 | -1.230179 | 0.571078 | 0.060061 | -0.225524 |
具有重复索引的时间序列(Time Series with Duplicate Indices)
在某些应用程序中,可能会有多个数据观测值落在特定时间戳上。下面是一个代码示例:
import numpy as np
import pandas as pdnp.random.seed(12345)dates = pd.DatetimeIndex(["2020-01-01", "2020-01-02", "2020-01-02","2020-01-02", "2020-01-03"])
dup_ts = pd.Series(np.arange(5), index=dates)
print(dup_ts)# 可以通过检查索引的 is_unique 属性来判断索引不唯一
print(dup_ts.index.is_unique)# 索引到此时间序列将生成标量值或切片,具体取决于时间戳是否重复:
# 如果用的是没有重复的索引则输出一个标量值
# 如果是有重复的索引则输出的是一个切片
print(dup_ts["2020-01-03"]) # 无重复
print(dup_ts["2020-01-02"]) # 有重复# 如果要聚合具有非唯一时间戳的数据。
# 一种方法是使用 groupby 并传递 level=0 (唯一的级别)
grouped = dup_ts.groupby(level=0)
print(grouped.mean())
print(grouped.count())
dup_ts输出:

dup_ts.index.is_unique 输出:False
dup_ts["2020-01-03"] 输出:4
dup_ts["2020-01-02"] 输出:

grouped.mean() 输出:

grouped.count() 输出:

相关文章:
Python数据分析NumPy和pandas(三十五、时间序列数据基础)
时间序列数据是许多不同领域的结构化数据的重要形式,例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的,也就是说,数据点根据某些规则定期出现,例如每 1…...
Python 小高考篇(6)常见错误及排查
目录 TypeError拼接字符串和数字错误示范正确示范 数字、字符串当成函数错误示范 给函数传入未被定义过的参数错误示范 传入的参数个数不正确错误示范 字符串相乘错误示范正确示范 量取整数的长度错误示范正确示范 格式化字符串时占位符个数不正确错误示范 给复数比较大小错误示…...
k8s上部署redis高可用集群
介绍: Redis Cluster通过分片(sharding)来实现数据的分布式存储,每个master节点都负责一部分数据槽(slot)。 当一个master节点出现故障时,Redis Cluster能够自动将故障节点的数据槽转移到其他健…...
C++的类和对象
在C中,类(class)和对象(object)是面向对象编程(OOP)的核心概念。以下是它们的详细介绍: 1. 类(Class) 定义: 类是用来定义一个新的数据类型&…...
自动驾驶系列—深入解析自动驾驶车联网技术及其应用场景
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
机器学习(1)
一、机器学习 机器学习(Machine Learning, ML)是人工智能(Artificial Intelligence, AI)的一个分支,它致力于开发能够从数据中学习并改进性能的算法和模型。机器学习的核心思想是通过数据和经验自动优化算法ÿ…...
深入理解 Redis跳跃表 Skip List 原理|图解查询、插入
1. 简介 跳跃表 ( skip list ) 是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 在 Redis 中,跳跃表是有序集合键的底层实现之一,那么这篇文章我们就来讲讲跳跃表的实现原理。 2. …...
Halcon HImage 与 Qt QImage 的相互转换(修订版)
很久以前,我写过一遍文章来介绍 HImage 和 QImage 之间的转换方法。(https://blog.csdn.net/liyuanbhu/article/details/91356988) 这个代码其实是有些问题的。因为我们知道 QImage 中的图像数据不一定是连续的,尤其是图像的宽度…...
【Golang】——Gin 框架中的模板渲染详解
Gin 框架支持动态网页开发,能够通过模板渲染结合数据生成动态页面。在这篇文章中,我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据,并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染?1.1 概…...
CSS:导航栏三角箭头
用CSS实现导航流程图的样式。可根据自己的需求进行修改,代码精略的写了一下。 注:场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅,自行处理。有个方法是直接在每个外面包一个DIV,用动态样式设置底色。 场景一、…...
onlyoffice Command service(命令服务)使用示例
一、说明 文档在这里:https://api.onlyoffice.com/docs/docs-api/additional-api/command-service/ 命令服务提供有几个简单的接口封装。也提供了前端和后端同时操作文档的可能。 二、正文 命令服务地址:https://documentserver/coauthoring/Com…...
QSS 设置bug
问题描述: 在QWidget上add 一个QLabel,但是死活不生效 原因: c 主程序如下: QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…...
交换排序——快速排序
交换排序——快速排序 7.7 交换排序——快速排序快速排序概念c语言的库函数qsort快速排序框架quickSort 7.7 交换排序——快速排序 快速排序概念 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法(下文简称快排),其基本思想为&a…...
nodejs入门(1):nodejs的前后端分离
一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的,当然,我肯定是很多年的计算机基础的,万变不离其宗。 现在web网站都流行所谓的前后端结构,不知不觉我也开始受到这个影响,以前都是前端直接操作…...
笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像
很简单的起因,我的东西最终需要跑在amd64上,但是因为mac的架构师arm64,所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构: docker inspect 8135f475e221 | grep Arc…...
gorm框架
连接 需要下载mysql的驱动 go get gorm.io/driver/mysql go get gorm.io/gorm 约定 主键:GORM 使用一个名为ID 的字段作为每个模型的默认主键。表名:默认情况下,GORM 将结构体名称转换为 snake_case 并为表名加上复数形式。 例如…...
免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制
Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。本文课题研究的“…...
【ASR技术】WhisperX安装使用
介绍 WhisperX 是一个开源的自动语音识别(ASR)项目,由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型,通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别(large-v2 为 70 倍实时…...
【计算机网络】协议定制
一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化,有现成的解决方案:①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数,根本就不是把数据发送到网络中!本质都是…...
【SQL】mysql常用命令
为方便查询,特整理MySQL常用命令。 约定:$后为Shell环境命令,>后为MySQL命令。 1 常用命令 第一步,连接数据库。 $ mysql -u root -p # 进入MySQL bin目录后执行,回车后输入密码连接。# 常用参数&…...
别只学STM32了!用ESP32-C3和FreeRTOS实战物联网项目(从环境搭建到云端通信)
从零构建基于ESP32-C3的智能环境监测系统:FreeRTOS与阿里云IoT实战指南 在嵌入式开发领域,传统的STM32学习路径已经不能满足物联网时代对无线连接和云端集成的需求。ESP32-C3作为一款集成Wi-Fi和蓝牙的RISC-V芯片,正成为物联网项目的理想选择…...
别再瞎配了!STM32 GPIO的8种模式到底怎么选?从按键到LED,实战场景帮你一次搞懂
STM32 GPIO模式实战指南:从按键到LED的精准配置策略 在嵌入式开发领域,GPIO(通用输入输出)作为最基础却至关重要的接口,其配置模式的选择往往决定了整个系统的稳定性和响应效率。许多初学者在理论学习阶段能够清晰区分…...
接口测试从入门到精通:这2个工具+3个实战案例,快速掌握
一、接口测试的核心价值与入门基础在软件测试体系中,接口测试是保障系统稳定性、数据准确性和业务连续性的关键环节。相较于UI测试,接口测试更贴近系统底层逻辑,能够提前发现数据传输、业务规则实现等方面的问题,大幅降低后期修复…...
The Incredible PyTorch终极指南:探索全球开发者贡献者墙的完整资源宝库
The Incredible PyTorch终极指南:探索全球开发者贡献者墙的完整资源宝库 【免费下载链接】the-incredible-pytorch The Incredible PyTorch: a curated list of tutorials, papers, projects, communities and more relating to PyTorch. 项目地址: https://gitc…...
当RPA遇到LLM:不是增强,而是消亡——AI Agent的3重涌现能力(实时感知、动态规划、跨工具协同)正在重写SOP定义权
更多请点击: https://intelliparadigm.com 第一章:当RPA遇到LLM:不是增强,而是消亡——AI Agent的3重涌现能力(实时感知、动态规划、跨工具协同)正在重写SOP定义权 传统RPA依赖预设脚本与静态流程图执行任…...
电镀整流机专业厂家选择:关键筛选维度深度解析
电镀整流机专业厂家选择:关键筛选维度深度解析电镀整流机作为工业表面处理的核心动力设备,其性能直接影响工件品质、生产效率与能耗成本。选择专业厂家时,需从技术实力、定制化能力、稳定性、服务体系及性价比等维度综合评估,以下…...
【Midjourney Sand印相终极指南】:从零掌握参数调优、材质控制与暗房级输出技巧
更多请点击: https://intelliparadigm.com 第一章:Midjourney Sand印相的技术起源与核心范式 Midjourney Sand印相并非官方术语,而是社区对Midjourney v6中一种高保真纹理建模能力的隐喻性命名——“Sand”取自其对沙粒、纸浆、矿物结晶等微…...
多FPGA原型验证:ASIC设计的关键技术与实践
1. 多FPGA原型设计的技术背景与核心挑战在当今半导体行业,ASIC设计复杂度呈指数级增长。以7nm工艺节点为例,单颗芯片可集成超过100亿个晶体管,这使得传统仿真验证方法面临巨大挑战。FPGA原型验证因其硬件加速特性,已成为ASIC开发流…...
从STM32移植过来:在GD32F450上快速跑通USB主机MSC(含完整代码)
从STM32到GD32F450的USB主机MSC移植实战指南 对于长期使用STM32进行嵌入式开发的工程师而言,当项目需要迁移至GD32平台时,既有的代码资产如何高效复用成为关键挑战。本文将以USB主机模式下Mass Storage Class(MSC)功能为例&#x…...
Pearcleaner终极指南:如何彻底清理Mac应用残留文件
Pearcleaner终极指南:如何彻底清理Mac应用残留文件 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 还在为Mac电脑存储空间不足而烦恼吗ÿ…...
