时间序列

一、datetime模块

1.datetime构造

import datetime
date=datetime.date(2018,3,2)
date
Out[ ]:datetime.date(2018, 3, 2)
date.year
Out[ ]:2018
date.month
Out[ ]:3
time=datetime.time(9,10,34)
time
Out[ ]:datetime.time(9, 10, 34)
time.second
Out[ ]:34
time.hour
Out[ ]:9
now=datetime.datetime.now()
now
Out[ ]:datetime.datetime(2020, 7, 4, 17, 20, 12, 682627)

timedelta类数据为两个datetime类数据的差,可通过datetime类对象加或减timedelta类对象,来获取新的datetime类对象。

delta=now-datetime.datetime(2018,3,5,9,12)
delta
Out[ ]:datetime.timedelta(days=852, seconds=29720, microseconds=911440)

delta2=now+datetime.timedelta(10)
delta2
Out[ ]:datetime.datetime(2020, 7, 14, 17, 27, 20, 911440)

2.数据转换

转化为字符串

test=datetime.datetime(2018,5,12)
test
Out[ ]:datetime.datetime(2018, 5, 12, 0, 0)
str(test)
Out[ ]:'2018-05-12 00:00:00'

转化为特定格式的字符串

test.strftime('%Y/%m/%d')
Out[ ]:'2018/05/12'
test.strftime('%W')
Out[ ]:'19'

通过datetime.strptime方法可以将字符串格式转换为datetime数据类型

value='2018-4-12'
datetime.datetime.strptime(value,'%Y-%m-%d')
Out[ ]:datetime.datetime(2018, 4, 12, 0, 0)

在pandas中,可以通过to_datetime方法将一列字符串转换为时间数据

salary['HireDate']=pd.to_datetime(salary['HireDate'])

二、时间序列基础

1.时间序列构造

pandas 中的时间序列指的是以时间数据为索引的Series或DataFrame

import numpy as np
import pandas as pd
from datetime import datetime
date=[datetime(2018,4,1),datetime(2018,4,5),
      datetime(2018,4,7),datetime(2018,4,9),
      datetime(2018,4,10),datetime(2018,4,15)]
s=pd.Series(np.arange(6),index=date)
s
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-07    2
2018-04-09    3
2018-04-10    4
2018-04-15    5
dtype: int32

2.索引与切片

s['20180415']
Out[ ]:5

s['2018/4/1']
Out[ ]:0

s['20180405':'20180411']
Out[ ]:
2018-04-05    1
2018-04-07    2
2018-04-09    3
2018-04-10    4
dtype: int32

s[datetime(2018,4,7):]
Out[ ]:
2018-04-07    2
2018-04-09    3
2018-04-10    4
2018-04-15    5
dtype: int32

对于长时间序列来说,可以通过年、月来轻松获取时间序列的切片。

date2=[datetime(2018,4,1),datetime(2018,4,5),
       datetime(2018,4,13),datetime(2018,4,27),
       datetime(2018,9,4),datetime(2018,9,8),
       datetime(2019,3,2),datetime(2019,6,17)]
s2=pd.Series(np.arange(8),index=date2)
s2
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-13    2
2018-04-27    3
2018-09-04    4
2018-09-08    5
2019-03-02    6
2019-06-17    7
dtype: int32

s2['2018']
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-13    2
2018-04-27    3
2018-09-04    4
2018-09-08    5
dtype: int32

s2['2018-04']
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-13    2
2018-04-27    3
dtype: int32

三、日期

1. 日期范围

使用pd.date_range函数可以创建指定长度的DatetimeIndex索引,默认时间频率是天,通过freq参数可以使用其他频率。

index=pd.date_range('2018/4/1','2018/5/30')
index
Out[ ]:
DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',
               '2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',
               '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',
               '2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',
               '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20',
               '2018-04-21', '2018-04-22', '2018-04-23', '2018-04-24',
               '2018-04-25', '2018-04-26', '2018-04-27', '2018-04-28',
               '2018-04-29', '2018-04-30', '2018-05-01', '2018-05-02',
               '2018-05-03', '2018-05-04', '2018-05-05', '2018-05-06',
               '2018-05-07', '2018-05-08', '2018-05-09', '2018-05-10',
               '2018-05-11', '2018-05-12', '2018-05-13', '2018-05-14',
               '2018-05-15', '2018-05-16', '2018-05-17', '2018-05-18',
               '2018-05-19', '2018-05-20', '2018-05-21', '2018-05-22',
               '2018-05-23', '2018-05-24', '2018-05-25', '2018-05-26',
               '2018-05-27', '2018-05-28', '2018-05-29', '2018-05-30'],
              dtype='datetime64[ns]', freq='D')

index=pd.date_range('2018/4/1','2018/12/31',freq='M')
index
Out[ ]:
DatetimeIndex(['2018-04-30', '2018-05-31', '2018-06-30', '2018-07-31',
               '2018-08-31', '2018-09-30', '2018-10-31', '2018-11-30',
               '2018-12-31'],
              dtype='datetime64[ns]', freq='M')

在pd.date_range函数中传入起始或结束日期,再用period参数传入一个表示一段时间的数据,就可以创建指定长度的DatetimeIndex索引。

pd.date_range(start='2018/4/1',periods=20)
Out[ ]:
DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',
               '2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',
               '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',
               '2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',
               '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20'],
              dtype='datetime64[ns]', freq='D')
pd.date_range(end='2018/4/1',periods=20)
Out[ ]:
DatetimeIndex(['2018-03-13', '2018-03-14', '2018-03-15', '2018-03-16',
               '2018-03-17', '2018-03-18', '2018-03-19', '2018-03-20',
               '2018-03-21', '2018-03-22', '2018-03-23', '2018-03-24',
               '2018-03-25', '2018-03-26', '2018-03-27', '2018-03-28',
               '2018-03-29', '2018-03-30', '2018-03-31', '2018-04-01'],
              dtype='datetime64[ns]', freq='D')

2. 频率与移动

  • 时间序列的常用基础频率
    D:每日历日
    B:每工作日
    H:每小时
    T或者min:每分钟
    S:每秒
pd.date_range(start='2018/4/1',periods=20,freq='2H20min38S')
Out[ ]:
DatetimeIndex(['2018-04-01 00:00:00', '2018-04-01 02:20:38',
               '2018-04-01 04:41:16', '2018-04-01 07:01:54',
               '2018-04-01 09:22:32', '2018-04-01 11:43:10',
               '2018-04-01 14:03:48', '2018-04-01 16:24:26',
               '2018-04-01 18:45:04', '2018-04-01 21:05:42',
               '2018-04-01 23:26:20', '2018-04-02 01:46:58',
               '2018-04-02 04:07:36', '2018-04-02 06:28:14',
               '2018-04-02 08:48:52', '2018-04-02 11:09:30',
               '2018-04-02 13:30:08', '2018-04-02 15:50:46',
               '2018-04-02 18:11:24', '2018-04-02 20:32:02'],
              dtype='datetime64[ns]', freq='8438S')
  • 移动数据是沿着时间索引将数据向前移或者向后移,通过用shift方法可以完成移动数据操作。
date4=pd.date_range('2018/4/1',periods=5)
s=pd.Series(np.arange(5),index=date4)
s
Out[ ]:
2018-04-01    0
2018-04-02    1
2018-04-03    2
2018-04-04    3
2018-04-05    4
Freq: D, dtype: int32
s.shift(2)
Out[ ]:
2018-04-01    NaN
2018-04-02    NaN
2018-04-03    0.0
2018-04-04    1.0
2018-04-05    2.0
Freq: D, dtype: float64
s.shift(-2)
Out[ ]:
2018-04-01    2.0
2018-04-02    3.0
2018-04-03    4.0
2018-04-04    NaN
2018-04-05    NaN
Freq: D, dtype: float64

如果再shift方法中传入频率参数freq,就是修改索引了。

s.shift(2,freq='D')
Out[ ]:
2018-04-03    0
2018-04-04    1
2018-04-05    2
2018-04-06    3
2018-04-07    4
Freq: D, dtype: int32

四、时期

1. 时期基础

Peries可以创建时期数据类型,传入字符串或者整数、频率即可。

p=pd.Period(2018,'A-DEC')
p
Out[ ]:
Period('2018', 'A-DEC')
p+2
Out[ ]:
Period('2020', 'A-DEC')

类似于pd.date_range,pd.period_range函数可以创建时期范围,PeriodIndex索引同样可以构造Series或者DataFrame。

date5=pd.period_range('2018/4/1','2018/10/5',freq='M')
date5
Out[ ]:
PeriodIndex(['2018-04', '2018-05', '2018-06', '2018-07', '2018-08', '2018-09',
             '2018-10'],
            dtype='period[M]', freq='M')

2. 频率转换

Period和PeriodIndex对象可以通过asfreq方法转换频率,如将年度转换为月度。

p=pd.Period(2018,freq='A-DEC')
p
Out[ ]:
Period('2018', 'A-DEC')

p.asfreq('M',how='start')
Out[ ]:
Period('2018-01', 'M')
date6=pd.period_range('2014','2018',freq='A-DEC')
date6
Out[ ]:
PeriodIndex(['2014', '2015', '2016', '2017', '2018'], dtype='period[A-DEC]', freq='A-DEC')

ps=pd.Series(np.arange(5),index=date6)
ps
Out[ ]:
2014    0
2015    1
2016    2
2017    3
2018    4
Freq: A-DEC, dtype: int32

利用to_period方法可以将由时间戳索引的时间序列数据转换为以时期为索引,通过to_timestamp方法可以进行逆操作。

date7=pd.date_range('2018/4/1',periods=4,freq='M')
s=pd.Series(np.arange(4),index=date7)
s
Out[ ]:
2018-04-30    0
2018-05-31    1
2018-06-30    2
2018-07-31    3
Freq: M, dtype: int32

ps=s.to_period()
ps
Out[ ]:
2018-04    0
2018-05    1
2018-06    2
2018-07    3
Freq: M, dtype: int32

五、频率转换与重采样

1. 重采样

pd.resample用于各种频率的转换工作,如将间隔为‘天’的频率聚合转换为‘月度’的频率。

date=pd.date_range('2018/4/1',periods=100,freq='D')
s=pd.Series(np.arange(100),index=date)
s.head(10)
Out[ ]:
2018-04-01    0
2018-04-02    1
2018-04-03    2
2018-04-04    3
2018-04-05    4
2018-04-06    5
2018-04-07    6
2018-04-08    7
2018-04-09    8
2018-04-10    9
Freq: D, dtype: int32

s.resample('M').mean()
Out[ ]:
2018-04-30    14.5
2018-05-31    45.0
2018-06-30    75.5
2018-07-31    95.0
Freq: M, dtype: float64
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356