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 datetime

now = 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 datetime

delta = 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, timedelta

start = 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, timedelta

stamp = datetime(2024, 1, 6)
print(str(stamp)) #输出 2024-01-06 00:00:00

print(stamp.strftime("%Y-%m-%d")) # 输出 2024-01-06

以下是日期格式规范的列表截图(自己翻译学习使用):

可以使用许多相同的格式代码通过 datetime.strptime 将字符串转换为日期(但某些代码,如 %F,不能使用):

from datetime import datetime, timedelta

value = "2024-01-06"
print(datetime.strptime(value, "%Y-%m-%d")) # 输出:2024-01-06 00:00:00

datestrs = ["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 pd

datestrs = ["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]) # 输出:NaT

print(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, timedelta

np.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, timedelta

np.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 pd

np.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 pd

np.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 datetime

np.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 datetime

np.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 pd

np.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 pd

np.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() 输出:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据常见面试题及答案(Linux、Zookeeper、Hadoop、Hive)

技术问答题目 一、Linux 1.如何给⽂件(⽂件夹)分配读r、w、x的操作权限? 2. vi 编辑器的常⽤命令有哪些? 3.Linux 中⽂件的操作权限分为⼏种? 4.Linux 中实时查看日志的方法 5. Linux查看内存、磁盘存储、io 读写、端口占用、进程等命…

【软件工程】一篇入门UML建模图(类图)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序

今天给大家分析一个音频分解器,通过傅里叶变换和信封匹配分离音乐中的各个音符和乐器,实现音乐到乐谱的转换。将音乐开源分离为组成乐器。该方式是盲源分离,从头开始制作,无需外部乐器分离库。 相关链接 代码:https:…

微服务day10-Redis面试篇

Redis主从 搭建主从集群 建立集群时主节点会生成同一的replicationID,交给各个从节点。 集群中的缓冲区是一个环型数组,即若从节点宕机时间过长,可能导致命令被覆盖。 主从集群优化 哨兵原理 哨兵是一个集群来确保哨兵不出现问题。 服务状态监控 选举…

交换排序——快速排序

交换排序——快速排序 7.7 交换排序——快速排序快速排序概念c语言的库函数qsort快速排序框架quickSort 7.7 交换排序——快速排序 快速排序概念 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法(下文简称快排),其基本思想为&a…

预处理(1)(手绘)

大家好,今天给大家分享一下编译器预处理阶段,那么我们来看看。 上面是一些预处理阶段的知识,那么明天给大家讲讲宏吧。 今天分享就到这里,谢谢大家!!

自动驾驶系列—深入解析自动驾驶车联网技术及其应用场景

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

华为路由策略配置

一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器

在深度学习的计算机视觉任务中,提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作,能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理,…

React--》如何高效管理前端环境变量:开发与生产环境配置详解

在前端开发中,如何让项目在不同环境下表现得更为灵活与高效,是每个开发者必须面对的挑战,从开发阶段的调试到生产环境的优化,环境变量配置无疑是其中的关键。 env配置文件:通常用于管理项目的环境变量,环境…

HuggingFace:基于YOLOv8的人脸检测模型

个人操作经验总结 1、YOLO的环境配置 github 不论base环境版本如何,建议在conda的虚拟环境中安装 1.1、创建虚拟环境 conda create -n yolov8-face python3.9conda create :创建conda虚拟环境, -n :给虚拟环境命名的…

基于Python的仓库管理系统设计与实现

背景: 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发,利用Django框架和MySQL数据库,实现了高效、便捷的仓库管理功能。 用户管理: 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…

当 docker-compose.yaml 文件部署时,Dify 线上版本升级过程

如果线上 Dify 是通过 docker-compose.yaml 文件部署的,那么当 Dify 版本升级时该如何操作呢?官方已经给出了 Docker compose 和 Source Code 两种方式。相对而言,前者更简单些,至少不需要安装依赖包和迁移数据库文件。为了更加具…

【H3C华三 】VRRP与BFD、Track联动配置案例

原创 厦门微思网络 组网需求 如图1所示,区域A和区域B用户所在网络的出口处部署了两台汇聚层设备(Device A和Device B)。 现要求使用VRRP与BFD、Track联动功能,实现以下需求: • 在Device A和Device B上分别配置两个…

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行,mentor给的是一个rosbag格式的数据包,配置过程出了几个问题记录一下,沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…

【汇编】c++游戏开发

由一起学编程创作的‘C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~’: C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~_射击c-CSDN博客文章浏览…

Vue Canvas实现区域拉框选择

canvas.vue组件 <template><div class"all" ref"divideBox"><!-- 显示图片&#xff0c;如果 imgUrl 存在则显示 --><img id"img" v-if"imgUrl" :src"imgUrl" oncontextmenu"return false" …

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

在MATLAB中导入TXT文件的若干方法

这是一篇关于如何在MATLAB中导入TXT文件的文章&#xff0c;包括示例代码和详细说明 文章目录 在MATLAB中导入TXT文件1. 使用readtable函数导入TXT文件示例代码说明 2. 使用load函数导入TXT文件示例代码说明 3. 使用importdata函数导入TXT文件示例代码说明 4. 自定义导入选项示例…

Clonezilla 再生龙制作系统U盘还原系统 ubuntu 22.04 server

参考 Clonezilla 再生龙制作系统U盘还原系统(UltraISO) https://blog.csdn.net/qq_57172130/article/details/120417522 Clonezilla-备份_部署ubuntu https://blog.csdn.net/xiaokai1999/article/details/131054826 基于再生龙&#xff08;clonezilla&#xff09;的Ubuntu镜…