Pandas系列(六)-时间序列详解

内容目录

  • 1. 基础概述
  • 2. 转换时间戳
  • 3. 生成时间戳范围
  • 4. DatetimeIndex
  • 5. DateOffset对象
  • 6. 与时间序列相关的方法
  • 6.1 移动
  • 6.2 频率转换
  • 6.3 重采样

 在处理时间序列的的过程中,我们经常会去做以下一些任务:

  1. 生成固定频率日期和时间跨度的序列
  2. 将时间序列整合或转换为特定频率
  3. 基于各种非标准时间增量(例如,在一年的最后一个工作日之前的5个工作日)计算“相对”日期,或向前或向后“滚动”日期

使用 Pandas 可以轻松完成以上任务。

一、基础概述

下面列出了 Pandas中 和时间日期相关常用的类以及创建方法。
类	              备注	         创建方法
Timestamp	     时刻数据	         to_datetime,Timestamp
DatetimeIndex	Timestamp的索引	  to_datetime,date_range,DatetimeIndex
Period	         时期数据	          Period
PeriodIndex	  Period	             period_range, PeriodIndex
Pandas 中关于时间序列最常见的类型就是时间戳(Timestamp)了,创建时间戳的方法有很多种,我们分别来看一看。

 基本方法

pd.Timestamp(2018,5,21)
Out[12]: Timestamp(‘2018-05-21 00:00:00‘)
pd.Timestamp(‘2018-5-21‘)
Out[13]: Timestamp(‘2018-05-21 00:00:00‘)
#除了时间戳之外,另一个常见的结构是时间跨度(Period)。
pd.Period("2018-01")
Out[14]: Period(‘2018-01‘, ‘M‘)
pd.Period("2018-05", freq="D")
Out[15]: Period(‘2018-05-01‘, ‘D‘)
#索引后会自动强制转为为 DatetimeIndex 和 PeriodIndex。
dates = [pd.Timestamp("2018-05-01"), pd.Timestamp("2018-05-02"), pd.Timestamp("2018-05-03"), pd.Timestamp("2018-05-04")]
ts = pd.Series(data=["Tom", "Bob", "Mary", "James"], index=dates)
ts.index
Out[16]: DatetimeIndex([‘2018-05-01‘, ‘2018-05-02‘, ‘2018-05-03‘, ‘2018-05-04‘], dtype=‘datetime64[ns]‘, freq=None)
periods = [pd.Period("2018-01"), pd.Period("2018-02"), pd.Period("2018-03"), pd.Period("2018-4")]
ts = pd.Series(data=["Tom", "Bob", "Mary", "James"], index=periods)
ts.index
Out[17]: PeriodIndex([‘2018-01‘, ‘2018-02‘, ‘2018-03‘, ‘2018-04‘], dtype=‘period[M]‘, freq=‘M‘)

二、转换时间戳

  你可能会想到,我们经常要和文本数据(字符串)打交道,能否快速将文本数据转为时间戳呢?
  答案是可以的,通过 to_datetime 能快速将字符串转换为时间戳。当传递一个Series时,它会返回一个Series(具有相同的索引),而类似列表的则转换为DatetimeIndex。

pd.to_datetime(pd.Series(["Jul 31, 2018", "2018-05-10", None]))
Out[18]:
0   2018-07-31
1   2018-05-10
2          NaT
dtype: datetime64[ns]
pd.to_datetime(["2005/11/23", "2010.12.31"])
Out[19]: DatetimeIndex([‘2005-11-23‘, ‘2010-12-31‘], dtype=‘datetime64[ns]‘, freq=None)
#除了可以将文本数据转为时间戳外,还可以将 unix 时间转为时间戳。
pd.to_datetime([1349720105, 1349806505, 1349892905], unit="s")
Out[20]:
DatetimeIndex([‘2012-10-08 18:15:05‘, ‘2012-10-09 18:15:05‘,
               ‘2012-10-10 18:15:05‘],
              dtype=‘datetime64[ns]‘, freq=None)
pd.to_datetime([1349720105100, 1349720105200, 1349720105300], unit="ms")
Out[21]:
DatetimeIndex([‘2012-10-08 18:15:05.100000‘, ‘2012-10-08 18:15:05.200000‘,
               ‘2012-10-08 18:15:05.300000‘],
              dtype=‘datetime64[ns]‘, freq=None)

三、生成时间戳范围

  有时候,我们可能想要生成某个范围内的时间戳。例如,我想要生成 "2018-6-26" 这一天之后的8天时间戳,如何完成呢?我们可以使用 date_range 和 bdate_range 来完成时间戳范围的生成。

pd.date_range("2018-6-26", periods=8)
Out[22]:
DatetimeIndex([‘2018-06-26‘, ‘2018-06-27‘, ‘2018-06-28‘, ‘2018-06-29‘,
               ‘2018-06-30‘, ‘2018-07-01‘, ‘2018-07-02‘, ‘2018-07-03‘],
              dtype=‘datetime64[ns]‘, freq=‘D‘)
pd.bdate_range("2018-6-26", periods=8)
Out[23]:
DatetimeIndex([‘2018-06-26‘, ‘2018-06-27‘, ‘2018-06-28‘, ‘2018-06-29‘,
               ‘2018-07-02‘, ‘2018-07-03‘, ‘2018-07-04‘, ‘2018-07-05‘],
              dtype=‘datetime64[ns]‘, freq=‘B‘)
#可以看出,date_range 默认使用的频率是 日历日,而 bdate_range 默认使用的频率是 营业日。当然了,我们可以自己指定频率,比如,我们可以按周来生成时间戳范围。
pd.date_range("2018-6-26", periods=8, freq="W")
Out[24]:
DatetimeIndex([‘2018-07-01‘, ‘2018-07-08‘, ‘2018-07-15‘, ‘2018-07-22‘,
               ‘2018-07-29‘, ‘2018-08-05‘, ‘2018-08-12‘, ‘2018-08-19‘],
              dtype=‘datetime64[ns]‘, freq=‘W-SUN‘) 

四. DatetimeIndex

DatetimeIndex 的主要作用是之一是用作 Pandas 对象的索引,使用它作为索引除了拥有普通索引对象的所
有基本功能外,还拥有简化频率处理的高级时间序列方法。

rng = pd.date_range("2018-6-24", periods=4, freq="W")
ts = pd.Series(range(len(rng)), index=rng)
ts
Out[25]:
2018-06-24    0
2018-07-01    1
2018-07-08    2
2018-07-15    3
Freq: W-SUN, dtype: int64
# 通过日期访问数据
ts["2018-07-08"]
Out[26]: 2
# 通过日期区间访问数据切片
ts["2018-07-08": "2018-07-22"]
Out[27]:
2018-07-08    2
2018-07-15    3
Freq: W-SUN, dtype: int64
#传入年份
ts["2018"]
Out[28]:
2018-06-24    0
2018-07-01    1
2018-07-08    2
2018-07-15    3
Freq: W-SUN, dtype: int64
# 传入年份和月份
ts["2018-07"]
Out[29]:
2018-07-01    1
2018-07-08    2
2018-07-15    3
Freq: W-SUN, dtype: int64
#除了可以使用字符串对 DateTimeIndex 进行索引外,还可以使用 datetime(日期时间)对象来进行索引。
from datetime import datetime
ts[datetime(2018, 7, 8) : datetime(2018, 7, 22)]
Out[30]:
2018-07-08    2
2018-07-15    3
Freq: W-SUN, dtype: int64
# 获取年份
ts.index.year
Out[31]: Int64Index([2018, 2018, 2018, 2018], dtype=‘int64‘)
# 获取星期几
ts.index.dayofweek
Out[32]: Int64Index([6, 6, 6, 6], dtype=‘int64‘)
# 获取一年中的第几个星期
ts.index.weekofyear
Out[33]: Int64Index([25, 26, 27, 28], dtype=‘int64‘)

五.DateOffset对象

DateOffset 从名称中就可以看出来是要做日期偏移的,它的参数与 dateutil.relativedelta基本相同,工作方式如下:

from pandas.tseries.offsets import *
d = pd.Timestamp("2018-06-25")
d + DateOffset(weeks=2, days=5)
Out[34]: Timestamp(‘2018-07-14 00:00:00‘)
#除了可以使用 DateOffset 完成上面的功能外,还可以使用偏移量实例来完成。
d + Week(2) + Day(5)
Out[35]: Timestamp(‘2018-07-14 00:00:00‘)

六、与时间序列相关的方法

在做时间序列相关的工作时,经常要对时间做一些移动/滞后、频率转换、采样等相关操作,我们来看下这些操作如何使用吧。

  6.1 移动

  如果你想移动或滞后时间序列,你可以使用 shift 方法。

  可以看到,Series 所有的值都都移动了 2 个距离。如果不想移动值,而是移动日期索引,可以使用 freq 参数,它可以接受一个 DateOffset 类或其他 timedelta 类对象或一个 offset 别名,所有别名详细介绍见:Offset Aliases(http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases)。

ts.shift(2)
Out[36]:
2018-06-24    NaN
2018-07-01    NaN
2018-07-08    0.0
2018-07-15    1.0
Freq: W-SUN, dtype: float64
ts.shift(2, freq=Day())
Out[37]:
2018-06-26    0
2018-07-03    1
2018-07-10    2
2018-07-17    3
Freq: W-TUE, dtype: int64
#可以看到,现在日期索引移动了 2 天的间隔。通过 tshift 同样可以达到相同的效果。
ts.tshift(2, freq=Day())
Out[38]:
2018-06-26    0
2018-07-03    1
2018-07-10    2
2018-07-17    3
Freq: W-TUE, dtype: int64

  6.2频率转换

  频率转换可以使用 asfreq 函数来实现。下面演示了将频率由周转为了天。

ts.asfreq(Day())
Out[39]:
2018-06-24    0.0
2018-06-25    NaN
2018-06-26    NaN
2018-06-27    NaN
2018-06-28    NaN
2018-06-29    NaN
2018-06-30    NaN
2018-07-01    1.0
2018-07-02    NaN
2018-07-03    NaN
2018-07-04    NaN
2018-07-05    NaN
2018-07-06    NaN
2018-07-07    NaN
2018-07-08    2.0
2018-07-09    NaN
2018-07-10    NaN
2018-07-11    NaN
2018-07-12    NaN
2018-07-13    NaN
2018-07-14    NaN
2018-07-15    3.0
Freq: D, dtype: float64
#聪明的你会发现出现了缺失值,因此 Pandas 为你提供了 method 参数来填充缺失值。几种不同的填充方法参考 Pandas 缺失值处理 中 fillna 介绍。
ts.asfreq(Day(), method="pad")
Out[40]:
2018-06-24    0
2018-06-25    0
2018-06-26    0
2018-06-27    0
2018-06-28    0
2018-06-29    0
2018-06-30    0
2018-07-01    1
2018-07-02    1
2018-07-03    1
2018-07-04    1
2018-07-05    1
2018-07-06    1
2018-07-07    1
2018-07-08    2
2018-07-09    2
2018-07-10    2
2018-07-11    2
2018-07-12    2
2018-07-13    2
2018-07-14    2
2018-07-15    3
Freq: D, dtype: int64

  6.3 重采样

  resample 表示根据日期维度进行数据聚合,可以按照分钟、小时、工作日、周、月、年等来作为日期维度,更多的日期维度见 Offset Aliases(http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases)。这里我们先以月来作为时间维度来进行聚合。

# 求出每个月的数值之和
ts.resample("1M").sum()
Out[41]:
2018-06-30    0
2018-07-31    6
Freq: M, dtype: int64
# 求出每个月的数值平均值
ts.resample("1M").mean()
Out[42]:
2018-06-30    0
2018-07-31    2
Freq: M, dtype: int64

  

 

原文地址:https://www.cnblogs.com/zhangyafei/p/10513893.html

时间: 2024-08-30 10:32:56

Pandas系列(六)-时间序列详解的相关文章

iOS网络编程(六) NSURLSession详解

昨夜浏览Demo的时候,看到别人请求网络数据用的是NSURLSession,当时就在想这里什么,怎么没有用过,引起了我的好奇心,遂去百度-谷歌-官方文档一一查看,有了一定的了解,原来NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的. 查找资料,写了一个小Demo,大家可以看看,有什么不足的地方,可以留言帮我指出来. // // HMTRootViewController.m // // // Created by HMT on 14-6-7.

Android组件系列----Activity组件详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3924567.html 联系方式:[email protected] [正文] 注:四大组件指的是应用组件:Activity.Service.BroadcastReceiver.ContentProvider:之前的控件指的是UI组件. 博文目录: 一.Activity简介 二.Activity的状

JBPM学习(六):详解流程图

概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中可以指定一个或多个Transition i. 开始活动(Start)中只能有一个Transition. ii. 结束活动(End)中没有Transition. iii. 其他活动中有一条或多条Transition b) 如果Transition只有一个,则可以不指定名称(名称是null):如果有多个

Android自定义控件系列八:详解onMeasure()(二)--利用onMeasure测量来实现图片拉伸永不变形,解决屏幕适配问题

上一篇文章详细讲解了一下onMeasure/measure方法在Android自定义控件时的原理和作用,参看博文:Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一),今天就来真正实践一下,让这两个方法大显神威来帮我们搞定图片的屏幕适配问题. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45038329,非允许请勿用于商业或盈利用途,违者必究. 使用ImageView会遇到

mongo 3.4分片集群系列之六:详解配置数据库

这个系列大致想跟大家分享以下篇章(我会持续更新的(^ω^)): 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4.mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域 5.mongo 3.4分片集群系列之五:详解平衡器 6.mongo 3.4分片集群系列之六:详解配置数据库 7.mongo 3.4分片集群系列之七:配置数

C++ list容器系列功能函数详解

C++ list函数详解 首先说下eclipse工具下怎样debug:方法:你先要设置好断点,然后以Debug方式启动你的应用程序,不要用run的方式,当程序运行到你的断点位置时就会停住,也会提示你进入到Debug视图方式操作,F5是进入到函数或语句块的内部,F6是单步运行,一行一行的走,F7可以跳当前监听函数或语句块F8 会直接跳到下个断点. 下面进入主题: 一.构造.析构函数.= 运算符 1.功能:声明list容器.4种方式 list<int> first;                

Ansible系列命令用法详解与使用

Ansible系列命令用法与使用 在上一个文章中已经完成了Ansible的安装,这片文章主要的用来记录Ansible一些命令的用法详解及其使用场景.好了非话不多说,'上菜吧'. Ansible命令行执行方式有Ad-hoc.Ansible-playbook两种方式.Web化执行方式其官方提供了付费产品Tower(10台以内免费),个人的话可以基于API开发类似的Web化产品.此篇文章主要针对于Ad-hoc.Ansible-playbook两种方式做详细介绍. 什么是Ad-hoc.Ansible-p

直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

VM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾回收算法 3.JVM垃圾回收器 4.JVM参数详解 5.JVM性能调优 JVM内存结构 由上图可以清楚的看到JVM的内存空间分为3大部分: 堆内存 方法区 栈内存 其中栈内存可以再细分为java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为Eden区.From Sur

广告行业中那些趣事系列4:详解从配角到C位出道的Transformer

摘要:上一篇广告行业中那些趣事系列3:NLP中的巨星BERT,从理论的角度讲了下NLP中有里程碑意义的BERT模型.BERT具有效果好和通用性强两大优点,其中效果好最主要的原因就是使用了Transformer作为特征抽取器.本篇主要详解下这个从配角到C位出道的Transformer,主要从宏观和微观的角度分析Transformer,讲下它的核心注意力机制Attention,然后以翻译任务举例讲下Transformer是如何进行工作的. 对充满挑战的高薪行业NLP感兴趣的小伙伴可以多多关注.不仅仅