当前位置: 首页 > news >正文

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"])

输出结果:

ColoradoTexasNew YorkOhio
2021-05-05-0.115413-0.3507450.044697-0.897756
2021-05-120.890874-1.151185-2.6123031.141250
2021-05-19-0.8671360.383583-0.4370300.347489
2021-05-26-1.2301790.5710780.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)的一个分支,它致力于开发能够从数据中学习并改进性能的算法和模型。机器学习的核心思想是通过数据和经验自动优化算法&#xff…...

深入理解 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 并为表名加上复数形式。 例如&#xf…...

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。本文课题研究的“…...

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别(ASR)项目,由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型,通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别(large-v2 为 70 倍实时&#xf…...

【计算机网络】协议定制

一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化,有现成的解决方案:①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数,根本就不是把数据发送到网络中!本质都是…...

【SQL】mysql常用命令

为方便查询,特整理MySQL常用命令。 约定:$后为Shell环境命令,>后为MySQL命令。 1 常用命令 第一步,连接数据库。 $ mysql -u root -p # 进入MySQL bin目录后执行,回车后输入密码连接。# 常用参数&…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...