Python数据分析(七):利用pandas处理时间序列数据

数据分析经常会遇到带有时间序列的数据,接下来我们看一下,利用pandas如何处理这类数据。

时间序列

  • 时间戳(timestamp)
  • 固定周期(period)
  • 时间间隔(interval)

一、创建时间序列

1、date_range

  • 可以指定开始时间与周期
  • H:小时
  • D:天
  • M:月

以天(day)为单位,输出后10天的时间序列

#TIMES #2016 Jul 1  7/1/2016    1/7/2016    2016-07-01    2016/07/01 
#时间格式可以换成上面的
rng = pd.date_range('2016/07/01',periods=10,freq='D')
rng

也可以3天为单位,输出后10个序列

rng = pd.date_range('2016/07/01',periods=10,freq='3D')
rng

或者指定起始时间

rng = pd.date_range(start = '2016/07/01',end = '2016/07/10',freq='D')
rng

生成Series序列

time = pd.Series(np.random.randn(20),index=pd.date_range(dt.datetime(2016,1,1),periods=20))
time

2、truncate过滤

time.truncate(before='2016-1-10')#过滤掉2016-1-10之前的数据
time.truncate(after='2016-1-10')#过滤掉之后的

提取数据

print(time['2016-01-15'])
print(time['2016-01-15':'2016-01-20'])#切片的方式
data = pd.date_range('2010-01-01','2011-01-01',freq='M')
data

参数freq中可以选的数值:


3、时间戳

pd.Timestamp('2016-07-10')
#可以指定更多细节
pd.Timestamp('2016-07-10 10')
pd.Timestamp('2016-07-10 10:15')

4、时间区间

pd.Period('2016-01')
pd.Period('2016-01-01')

5、时间加减

  • TIME OFFSETS

产生一个一天的时间偏移量

#产生一个一天的时间偏移量
pd.Timedelta('1 day')
#得到2016-01-01 10:10的后一天时刻:
pd.Period('2016-01-01 10:10') + pd.Timedelta('1 day')
#时间戳加减:
pd.Timestamp('2016-01-01 10:10') + pd.Timedelta('1 day')
#加15ns
pd.Timestamp('2016-01-01 10:10') + pd.Timedelta('15 ns')

在时间间隔freq参数中,我们既可以写成25H,也可以写成1D1H这种通俗的表达:

pd.period_range('2016-01-01 10:10',freq='25H',periods=10)
pd.period_range('2016-01-01 10:10',freq='1D1H',periods=10)

6、指定索引

rng = pd.date_range('2016 Jul 1',periods=10,freq='D')
pd.Series(range(len(rng)),index=rng)
#构造任意的Series结构时间序列数据:
periods=[pd.Period('2016-01'),pd.Period('2016-02'),pd.Period('2016-03')]
ts = pd.Series(np.random.randn(len(periods)),index=periods)
ts
type(ts.index)

7、时间戳和时间周期可以转换

#产生时间周期
ts = pd.Series(range(10),pd.date_range('07-10-16 8:00',periods=10,freq='H'))
ts
#将时间周期转化为时间戳
ts_period = ts.to_period()
ts_period

8、时间周期和时间戳的区别

  • 对时间周期的切片操作
ts_period['2016-07-10 08:30':'2016-07-10 11:45']
  • 对时间戳的切片操作
ts['2016-07-10 08:30':'2016-07-10 11:45']

二、数据重采样

  • 时间数据由一个频率转换到另一个频率
  • 降采样:例如将365天数据变为12个月的数据
  • 升采样:相反
#从1/1/2011开始,时间间隔为1天,产生90个时间数据
rng = pd.date_range('1/1/2011',periods=90,freq='D')
ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts.head()

1、降采样

#将以上数据降采样为月数据,观察每个月数据之和、
ts.resample('M').sum()
#降采样为3天,并求和
ts.resample('3D').sum()

计算降采样后数据均值

#计算降采样后数据均值
day3Ts=ts.resample('3D').mean()
day3Ts

2、升采样

直接升采样是有问题的,因为有数据缺失

#
day3Ts.resample('D').asfreq()

使用插值的方法

  • ffill 空值取前面的值
  • bfill 空值取后面的值
  • interpolate 线性取值
day3Ts.resample('D').ffill(1)#一个值填充
day3Ts.resample('D').ffill(2)#两个值填充

全部空值填充

day3Ts.resample('D').ffill()
day3Ts.resample('D').bfill(1)
day3Ts.resample('D').bfill(2)
day3Ts.resample('D').bfill()

使用interpolate线性取值

# 使用interpolate线性取值
day3Ts.resample('D').interpolate('linear')

三、Pandas滑动窗口

为了提升数据的准确性,将某个点的取值扩大到包含这个点的一段区间,用区间来进行判断,这个区间就是窗口。例如想使用2011年1月1日的一个数据,单取这个时间点的数据当然是可行的,但是太过绝对,有没有更好的办法呢?可以选取2010年12月16日到2011年1月15日,通过求均值来评估1月1日这个点的值,2010-12-16到2011-1-15就是一个窗口,窗口的长度window=30.

移动窗口就是窗口向一端滑行,默认是从右往左,每次滑行并不是区间整块的滑行,而是一个单位一个单位的滑行。例如窗口2010-12-16到2011-1-15,下一个窗口并不是2011-1-15到2011-2-15,而是2010-12-17到2011-1-16(假设数据的截取是以天为单位),整体向右移动一个单位,而不是一个窗口。这样统计的每个值始终都是30单位的均值。

也就是我们在统计学中的移动平均法。

import matplotlib.pylab
import numpy as np
import pandas as pd 
%matplotlib inline
df = pd.Series(np.random.randn(600),index=pd.date_range('7/1/2016',freq='D',periods=600))
df.head()
#指定该序列一个单位长度为10的滑块
r=df.rolling(window = 10)
r
#输出滑块内的平均值,窗口中的值从覆盖整个窗口的位置开始产生,在此之前即为NaN,举例如下:窗口大小为10,前9个都不足够为一个一个窗口的长度,因此都无法取值。
r.mean()
# 通过画图库来看原始序列与滑动窗口产生序列的关系图,原始数据用红色表示,移动平均后数据用蓝色点表示:
import matplotlib.pyplot as plt
plt.figure(figsize=(15,5))
df.plot(style='r--')
df.rolling(window=10).mean().plot(style='b')#可以看到,原始值浮动差异较大,而移动平均后数值较为平稳。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容