作为一个几乎每天与时间序列数据打交道的人员,我发现panda Python包在时间序列的操作和分析方面有强大优势。

这篇关于panda时间序列数据处理的基本介绍可以带你入门时间序列分析。本文将主要介绍以下操作:

  • 创建一个日期范围
  • 处理时间戳数据
  • 将字符串数据转换为时间戳
  • 在数据框中索引和切片时间序列数据
  • 重新采样不同时间段的时间序列汇总/汇总统计数据
  • 计算滚动统计数据,如滚动平均值
  • 处理丢失数据
  • 了解unix/epoch时间的基础知识
  • 了解时间序列数据分析的常见陷阱

接下来我们一起步入正题。如果想要处理已有的实际数据,你可能考虑从使用panda read_csv将文件读入数据框开始,然而在这里,我们将直接从处理生成的数据开始。

首先导入我们将会使用到的库,然后用它们创建日期范围

import pandas as pd
from datetime import datetime
import numpy as npdate_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')

这个日期范围的时间戳为每小时一次。如果我们调用date_rng,我们会看到如下所示:

DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00','2018-01-01 02:00:00', '2018-01-01 03:00:00','2018-01-01 04:00:00', '2018-01-01 05:00:00','2018-01-01 06:00:00', '2018-01-01 07:00:00','2018-01-01 08:00:00', '2018-01-01 09:00:00',...'2018-01-07 15:00:00', '2018-01-07 16:00:00','2018-01-07 17:00:00', '2018-01-07 18:00:00','2018-01-07 19:00:00', '2018-01-07 20:00:00','2018-01-07 21:00:00', '2018-01-07 22:00:00','2018-01-07 23:00:00', '2018-01-08 00:00:00'],dtype='datetime64[ns]', length=169, freq='H')

我们可以检查第一个元素的类型:

type(date_rng[0])
#returns
pandas._libs.tslib.Timestamp

让我们用时间戳数据的创建一个示例数据框,并查看前15个元素:

df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
df.head(15)

如果想进行时间序列操作,我们需要一个日期时间索引。这样一来,数据框便可以在时间戳上建立索引。

将数据框索引转换为datetime索引,然后显示第一个元素:

df['datetime'] = pd.to_datetime(df['date'])
df = df.set_index('datetime')
df.drop(['date'], axis=1, inplace=True)
df.head()

如果数据中的“时间”戳实际上是字符串类型和数值类型相比较,该怎么办呢?我们可以将date_rng转换为字符串列表,然后将字符串转换为时间戳。

string_date_rng = [str(x) for x in date_rng]
string_date_rng
#returns
['2018-01-01 00:00:00','2018-01-01 01:00:00','2018-01-01 02:00:00','2018-01-01 03:00:00','2018-01-01 04:00:00','2018-01-01 05:00:00','2018-01-01 06:00:00','2018-01-01 07:00:00','2018-01-01 08:00:00','2018-01-01 09:00:00',...

可以通过推断字符串的格式将其转换为时间戳,然后查看这些值:

timestamp_date_rng = pd.to_datetime(string_date_rng, infer_datetime_format=True)
timestamp_date_rng
#returns
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00','2018-01-01 02:00:00', '2018-01-01 03:00:00','2018-01-01 04:00:00', '2018-01-01 05:00:00','2018-01-01 06:00:00', '2018-01-01 07:00:00','2018-01-01 08:00:00', '2018-01-01 09:00:00',...'2018-01-07 15:00:00', '2018-01-07 16:00:00','2018-01-07 17:00:00', '2018-01-07 18:00:00','2018-01-07 19:00:00', '2018-01-07 20:00:00','2018-01-07 21:00:00', '2018-01-07 22:00:00','2018-01-07 23:00:00', '2018-01-08 00:00:00'],dtype='datetime64[ns]', length=169, freq=None)

但是如果需要转换一个唯一的字符串格式呢?

我们可以创建一个任意的字符串形式的日期列表,并将它们转换为时间戳:

string_date_rng_2 = ['June-01-2018', 'June-02-2018', 'June-03-2018']
timestamp_date_rng_2 = [datetime.strptime(x,'%B-%d-%Y') for x in string_date_rng_2]
timestamp_date_rng_2
#returns
[datetime.datetime(2018, 6, 1, 0, 0),datetime.datetime(2018, 6, 2, 0, 0),datetime.datetime(2018, 6, 3, 0, 0)]

如果把它放到数据框中,将会如何?

df2 = pd.DataFrame(timestamp_date_rng_2, columns=['date'])
df2

回到最初的数据框架,让我们通过解析时间戳索引来查看数据:

假设只想查看本月2号的数据,可以使用如下索引。

df[df.index.day == 2]

顶部如图所示:

也可以通过数据框索引直接调用想查看的日期:

df['2018-01-03']

如何在特定日期之间选择数据

df['2018-01-04':'2018-01-06']

我们填充的基本数据框提供了频率以小时计的数据,但同样可以以不同的频率重新采样数据,并指定如何计算新样本频率的汇总统计信息。我们可以取每天频率下数据的最小值、最大值、平均值、总和等,而不是每小时的频率,如下面的例子,计算每天数据的平均值:

df.resample('D').mean()

那么诸如滚动平均值或滚动和之类的窗口统计信息呢?

让我们在原来的df中创建一个新列,计算3个窗口周期内的滚动和,然后查看数据框的顶部:

df ['rolling_sum'] = df.rolling(3).sum()
df.head(10)

可以看到,在这个正确的计算中,只有当存在三个周期可以回顾时,它才开始具有有效值。

这可以有效地帮我们了解到,当处理丢失的数据值时,如何向前或向后“滚动”数据。

这是我们的df,但有一个新的列,采取滚动求和并向后“滚动”数据:

df['rolling_sum'] = df.rolling(3).sum()
df.head(10)

采用诸如平均时间之类的实际值用于填补丢失的数据,这种方法通常来说是有效的。但一定谨记,如果你正处理一个时间序列的问题,并且希望数据是切合实际的,那么你不应该向后“滚动”数据。因为这样一来,你需要的关于未来的信息就永远不可能在那个时间获取到。你可能更希望频繁地向前“滚动”数据,而不是向后“滚动”。

在处理时间序列数据时,可能会遇到Unix时间中的时间值。Unix时间,也称为Epoch时间,是自协调世界时(UTC) 1970年1月1日星期四00:00:00以后经过的秒数。使用Unix时间有助于消除时间戳的歧义,这样我们就不会被时区、夏令时等混淆。

下面是一个时间t在Epoch时间的例子,它将Unix/Epoch时间转换为UTC中的常规时间戳:

epoch_t = 1529272655
real_t = pd.to_datetime(epoch_t, unit='s')
real_t
#returns
Timestamp('2018-06-17 21:57:35')

如果我想把UTC中的时间转换为自己的时区,可以简单地做以下操作:

real_t.tz_localize('UTC').tz_convert('US/Pacific')
#returns
Timestamp('2018-06-17 14:57:35-0700', tz='US/Pacific')

掌握了这些基础知识后,就可以开始处理时间序列数据了。

以下是一些处理时间序列数据时要记住的技巧和常见的陷阱:

  • 检查数据中可能由区域特定时间变化(如夏令时)引起的差异
  • 精心跟踪时区 - 让他人通过代码了解你的数据所在的时区,并考虑转换为UTC或标准化值以保持数据标准化。
  • 丢失的数据可能经常发生 - 请确保记录清洁规则并考虑不回填在采样时无法获得的信息。
  • 请记住,当重新采样数据或填写缺失值时,将丢失有关原始数据集的一定数量的信息。建议跟踪所有数据转换并跟踪数据问题根源。
  • 重新采样数据时,最佳方法(平均值,最小值,最大值,总和等)取决于拥有的数据类型以及采样方式。请仔细考虑如何重新采样数据以进行分析。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

Pandas时序数据处理入门相关推荐

  1. 黄金价格预测:如何将时序数据处理成监督学习数据

    背景概述 今天介绍下如何将时序数据处理成监督学习可用的训练样本.比较典型的场景是黄金的原始数据,一般黄金走势数据是由两个字段组成,分别是时间字段和价格字段. 走势图如下: 顺便安利一个黄金数据的下载网 ...

  2. 数据导入与预处理-拓展-pandas时间数据处理01

    数据导入与预处理-拓展-pandas时间数据处理01 Pandas时序数据系列博客 Pandas时间序列数据处理 1.好用的Python库 2.Pandas历史 3.时序数据处理 3.1 时序中的基本 ...

  3. 视音频数据处理入门:RGB、YUV像素数据处理【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/50534150 ==================================== ...

  4. python 取反_自从用了这招pandas 空数据处理方法,python编程速度提升了不少

    今天为大家带来的内容是:自从用了这招pandas 空数据处理方法,python编程速度提升了不少 文章内容主要介绍了pandas 空数据处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工 ...

  5. Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略

    Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介.具体案例.使用方法之详细攻略 目录 pandas中数据处理常用函数(isnull/dropna/fillna/ ...

  6. ffmpeg 怎么处理udp音频_视音频数据处理入门:UDP-RTP协议解析

    ===================================================== 视音频数据处理入门系列文章: =============================== ...

  7. 推荐系统-应用Pandas进行数据处理

    1. PANDAS PANDAS是一个包,它使我们能够访问高性能.易于使用的工具和数据结构,以便在Python中进行数据分析. Python是一种运行很慢的语言.PANDAS通过使用C编程语言实现大量 ...

  8. 视音频数据处理入门:UDP-RTP协议解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  9. 视音频数据处理入门:AAC音频码流解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

最新文章

  1. [MySQL FAQ]系列 -- mysql是否支持跨库事务
  2. RabbitMQ消息队列系列教程(一)认识RabbitMQ
  3. lombok 不用再写pojo的getset
  4. 未雨绸缪 | 一文简介 Azure Front Door
  5. LeetCode 1. 两数之和(哈希)
  6. Mysql更改表名大小写不敏感
  7. Bootstrap3 Font Awesome 字体图标带动画的图标
  8. 如何更换ppt模板内容不变_如何制作一个优秀的PPT?附18000+套精品PPT模板
  9. ftp ---- 配置文件(默认配置文件解读)
  10. server接收dtu透传代码_Swoole学习笔记二:初探server与client(Client同步)
  11. MySQL中的 UNIX_TIMESTAMP 函数使用总结(附详例)
  12. Spark Mllib里数据集如何取前M行(图文详解)
  13. java编译前端_compiler Java实现的编译器前端(一直到中间代码生成)其中使用了JFLEX及CUP做Lex program /解释器 238万源代码下载- www.pudn.com...
  14. 我的世界java出生蘑菇岛,《我的世界》出生就有蘑菇岛和海底神庙的地图,附近还有村庄!...
  15. excel 数据透视表完成分类汇总
  16. 360se html怎么删除,360安全浏览器服务组件能删除吗 如何删除
  17. 标准Lena测试图像下载
  18. 基于python的opc读写和导入MSSQL/MYSQL的KepOPC中间件
  19. 网络安全防护体系建设
  20. 常用的vue组件库总结

热门文章

  1. python适用的操作系统是_操作系统先来先服务python
  2. linux set权限,Linux 特殊权限set_uid(示例代码)
  3. android 浮动按钮拖拽,小程序拖拽浮动按钮
  4. 6-7 使用函数输出水仙花数_学习C语言居然对printf函数不理解???
  5. mac os 开启redis_关于Redis,学会这8点就够了
  6. android 屏幕飘动,Android自定义View实现飘动的叶子效果(三)
  7. python3源代码是什么_如何用inspect查找python3源代码?
  8. 中科院院士:很多人没有真正理解科学研究的本质
  9. 原来数学才是世界上最浪漫的学科!
  10. 谷歌用算力爆了一篇论文,解答有关无限宽度网络的一切