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目录后执行,回车后输入密码连接。# 常用参数&…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
