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

Pandas时间序列

Pandas时间序列

pandas 提供了一组标准的时间序列处理工具和数据算法

数据类型及操作

Python 标准库的 datetime

datetime 模块中的 datetime、 time、 calendar 等类都可以用来存储时间类型以及进行一些转换和运算操作。

from datetime import datetime
now = datetime.now()
now
datetime.datetime(2017, 10, 9, 12, 41, 23, 916666)
delta = datetime(2010,2,2)-datetime(2010,2,1)
delta
datetime.timedelta(1)
now + delta
datetime.datetime(2017, 10, 10, 12, 41, 23, 916666)

datetime 对象间的减法运算会得到一个 timedelta 对象,表示一个时间段。

datetime 对象与它所保存的字符串格式时间戳之间可以互相转换。str() 函数是可用的,但更推荐 datetime.strptime() 方法。这个方法可以实现双向转换。

str(now)
'2017-10-09 12:41:23.916666'
now.strftime('%Y-%m-%d')
'2017-10-09'
datetime.strptime('2010-01-01','%Y-%m-%d')
datetime.datetime(2010, 1, 1, 0, 0)

pandas 的 TimeStamp

pandas 最基本的时间日期对象是一个从 Series 派生出来的子类 TimeStamp,这个对象与 datetime 对象保有高度兼容性,可通过 pd.to_datetime() 函数转换。(一般是从 datetime 转换为 Timestamp)

import pandas as pd

pd.to_datetime(now)
Timestamp('2017-10-09 12:41:23.916666')
import numpy as np

pd.to_datetime(np.nan)
NaT

pandas 的时间序列

pandas 最基本的时间序列类型就是以时间戳(TimeStamp)为 index 元素的 Series 类型。

dates = [datetime(2011,1,1),datetime(2011,1,2),datetime(2011,1,3)]
ts = pd.Series(np.random.randn(3),index=dates)
ts
2011-01-01   -0.233171
2011-01-02   -1.053316
2011-01-03   -0.448214
dtype: float64
type(ts)
pandas.core.series.Series
ts.index
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03'], dtype='datetime64[ns]', freq=None)
ts.index[0]
Timestamp('2011-01-01 00:00:00')

时间序列之间的算术运算会自动按时间对齐。


索引、选取、子集构造

时间序列只是 index 比较特殊的 Series ,因此一般的索引操作对时间序列依然有效。其特别之处在于对时间序列索引的操作优化。如使用各种字符串进行索引:

ts['20110101']
-0.23317140272262557
ts['2011-01-01']
-0.23317140272262557
ts['01/01/2011']
-0.23317140272262557

对于较长的序列,还可以只传入 “年” 或 “年月” 选取切片:

ts
2011-01-01   -0.233171
2011-01-02   -1.053316
2011-01-03   -0.448214
dtype: float64
ts['2011']
2011-01-01   -0.233171
2011-01-02   -1.053316
2011-01-03   -0.448214
dtype: float64
ts['2011-1-2':'2012-12']
2011-01-02   -1.053316
2011-01-03   -0.448214
dtype: float64

生成日期范围

pd.date_range() 可用于生成指定长度的 DatetimeIndex。参数可以是起始结束日期,或单给一个日期,加一个时间段参数。日期是包含的。

pd.date_range('20100101','20100110')
DatetimeIndex(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
               '2010-01-05', '2010-01-06', '2010-01-07', '2010-01-08',
               '2010-01-09', '2010-01-10'],
              dtype='datetime64[ns]', freq='D')
pd.date_range(start='20100101',periods=10)
DatetimeIndex(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
               '2010-01-05', '2010-01-06', '2010-01-07', '2010-01-08',
               '2010-01-09', '2010-01-10'],
              dtype='datetime64[ns]', freq='D')
pd.date_range(end='20100110',periods=10)
DatetimeIndex(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
               '2010-01-05', '2010-01-06', '2010-01-07', '2010-01-08',
               '2010-01-09', '2010-01-10'],
              dtype='datetime64[ns]', freq='D')

移动(超前和滞后)数据

移动(shifting)指的是沿着时间轴将数据前移或后移。Series 和 DataFrame 都有一个 .shift() 方法用于执行单纯的移动操作,index 维持不变:

ts
2011-01-01   -0.233171
2011-01-02   -1.053316
2011-01-03   -0.448214
dtype: float64
ts.shift(2)
2011-01-01         NaN
2011-01-02         NaN
2011-01-03   -0.233171
dtype: float64
ts.shift(-2)
2011-01-01   -0.448214
2011-01-02         NaN
2011-01-03         NaN
dtype: float64

因为移动操作产生了 NA 值,另一种移动方法是移动 index,而保持数据不变。这种移动方法需要额外提供一个 freq 参数来指定移动的频率:

ts.shift(2,freq='D')
2011-01-03   -0.233171
2011-01-04   -1.053316
2011-01-05   -0.448214
Freq: D, dtype: float64
ts.shift(2,freq='3D')
2011-01-07   -0.233171
2011-01-08   -1.053316
2011-01-09   -0.448214
Freq: D, dtype: float64

时期及其算术运算

时期(period)概念不同于前面的时间戳(timestamp),指的是一个时间段。但在使用上并没有太多不同,pd.Period 类的构造函数仍需要一个时间戳,以及一个 freq 参数。freq 用于指明该 period 的长度,时间戳则说明该 period 在公园时间轴上的位置。

p = pd.Period(2010,freq='M')
p
Period('2010-01', 'M')
p + 2
Period('2010-03', 'M')

上例中我给 period 的构造器传了一个 “年” 单位的时间戳和一个 “Month” 的 freq,pandas 便自动把 2010 解释为了 2010-01。

period_range 函数可用于创建规则的时间范围:

pd.period_range('2010-01','2010-05',freq='M')
PeriodIndex(['2010-01', '2010-02', '2010-03', '2010-04', '2010-05'], dtype='period[M]', freq='M')

PeriodIndex 类保存了一组 period,它可以在任何 pandas 数据结构中被用作轴索引:

pd.Series(np.random.randn(5),index=pd.period_range('201001','201005',freq='M'))
2010-01    1.770363
2010-02   -0.402647
2010-03   -0.562749
2010-04   -0.606754
2010-05   -0.368662
Freq: M, dtype: float64

重采样

Pandas可以通过频率转换简单高效的进行重新采样

Pandas在对频率转换进行重新采样时拥有简单、强大且高效的功能(如将按秒采样的数据转换为按分钟为单位进行采样的数据)。这种操作在金融领域非常常见。

rng = pd.date_range('1/1/2012', periods=10, freq='S')
rng
DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 00:00:01',
               '2012-01-01 00:00:02', '2012-01-01 00:00:03',
               '2012-01-01 00:00:04', '2012-01-01 00:00:05',
               '2012-01-01 00:00:06', '2012-01-01 00:00:07',
               '2012-01-01 00:00:08', '2012-01-01 00:00:09'],
              dtype='datetime64[ns]', freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts
2012-01-01 00:00:00    417
2012-01-01 00:00:01    192
2012-01-01 00:00:02     86
2012-01-01 00:00:03    393
2012-01-01 00:00:04    354
2012-01-01 00:00:05    234
2012-01-01 00:00:06    440
2012-01-01 00:00:07    248
2012-01-01 00:00:08     59
2012-01-01 00:00:09    335
Freq: S, dtype: int32
ts.resample('1Min').sum() # 将秒级数据整合(加)成1min的数据
2012-01-01    2758
Freq: T, dtype: int32

其他类型数值转为时间类型

时间字符串转时间格式:整型例如 20010100000000 这类格式容易当成时间戳转错,带format格式才行

a = pd.DataFrame([[20010101,100000,'aaa'],[20010201,230100,'bbb']])
a
012
020010101100000aaa
120010201230100bbb
pd.to_datetime(a[0],format='%Y%m%d')
0   2001-01-01
1   2001-02-01
Name: 0, dtype: datetime64[ns]

相关文章:

  • Centos_7安装python-pip
  • 用Libaad2来进行AAC解码
  • libjingle翻译之《Important Concepts(重要概念)之Transports, Channels, and Connections(传输、通道、链接)》...
  • [转载]WCF系列_分布式事务(下)
  • EF基础知识小记五(一对多、多对多处理)
  • 智能语音控制中心 - 树莓派、Nanopi、Orangepi语音识别控制
  • NFS启动时报错Linux NFS:could not open connection for tcp6
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 性能与性价比的平衡,阿里云第二代入门级实例T5详解
  • 13个绚丽的Jquery 界面设计
  • 20162321王彪 2017-2018《程序设计与数据结构》第五周学习总结
  • 剪我一根头发,就要做我一天女人。
  • VS2008 F5不能调试情况一例
  • 短路径算法-Dijkstra算法的应用之单词转换(词梯问题)
  • C++多线程中调用python api函数
  • 【附node操作实例】redis简明入门系列—字符串类型
  • CSS相对定位
  • css选择器
  • echarts花样作死的坑
  • Fastjson的基本使用方法大全
  • js ES6 求数组的交集,并集,还有差集
  • nginx 负载服务器优化
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • ubuntu 下nginx安装 并支持https协议
  • VuePress 静态网站生成
  • 阿里云Kubernetes容器服务上体验Knative
  • 服务器从安装到部署全过程(二)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 因为阿里,他们成了“杭漂”
  • 怎么把视频里的音乐提取出来
  • 通过调用文摘列表API获取文摘
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​linux启动进程的方式
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $forceUpdate()函数
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (转)为C# Windows服务添加安装程序
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 4.0中的泛型协变和反变
  • .NET CLR Hosting 简介
  • .Net Web项目创建比较不错的参考文章
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @SentinelResource详解
  • @vue/cli 3.x+引入jQuery
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • []指针
  • [100天算法】-目标和(day 79)