Data Science | 这些时间序列的骚操作啊

简介: Data Science | 这些时间序列的骚操作啊

Pandas时间戳索引-DatetimeIndex

pd.DatetimeIndex()与TimeSeries时间序列

pd.DatetimeIndex()可以直接生成时间戳索引,支持使用str、datetime.datetime。

单个时间戳的类型为Timestamp,多个时间戳的类型为DatetimeIndex,示例如下:

rng = pd.DatetimeIndex(['12/1/2017','12/2/2017','12/3/2017','12/4/2017','12/5/2017'])
print(rng,type(rng))
print(rng[0],type(rng[0]))
>>>
DatetimeIndex(['2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04',
               '2017-12-05'],
              dtype='datetime64[ns]', freq=None) <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
2017-12-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
什么是TimeSeries时间序列?

DatetimeIndex为index的Series,为TimeSries时间序列

举个栗子:

st = pd.Series(np.random.rand(len(rng)), index = rng)
print(st,type(st))
print(st.index)
>>>
2017-12-01    0.081920
2017-12-02    0.921781
2017-12-03    0.489779
2017-12-04    0.257632
2017-12-05    0.805373
dtype: float64 <class 'pandas.core.series.Series'>
DatetimeIndex(['2017-12-01', '2017-12-02', '2017-12-03', '2017-12-04',
               '2017-12-05'],
              dtype='datetime64[ns]', freq=None)

pd.date_range()-生成日期范围

pd.date_range()生成日期范围有两种生成方式(默认频率是day):

  • 起始时间(start) + 结束时间(end)
  • 起始时间(start)/结束时间(end) + 偏移量(periods)

举个栗子:

date1 = pd.date_range('2017/1/1','2017/10/1',normalize=True)
print(date1)
date2 = pd.date_range(start = '1/1/2017', periods = 10)
print(date2)
date3 = pd.date_range(end = '1/30/2017 15:00:00', periods = 10,normalize=True)  # 增加了时、分、秒
print(date3)
>>>
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10',
               ...
               '2017-09-22', '2017-09-23', '2017-09-24', '2017-09-25',
               '2017-09-26', '2017-09-27', '2017-09-28', '2017-09-29',
               '2017-09-30', '2017-10-01'],
              dtype='datetime64[ns]', length=274, freq='D')
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10'],
              dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2017-01-21', '2017-01-22', '2017-01-23', '2017-01-24',
               '2017-01-25', '2017-01-26', '2017-01-27', '2017-01-28',
               '2017-01-29', '2017-01-30'],
              dtype='datetime64[ns]', freq='D')
pd.date_range(start=None, end=None, periods=None, freq='D', tz=None, normalize=False, name=None, closed=None, **kwargs)

其中常用参数含义如下:

  • start:开始时间
  • end:结束时间
  • periods:偏移量
  • freq:频率,默认天,pd.date_range()默认频率为日历日,pd.bdate_range()默认频率为工作日
  • tz:时区
  • normalize:时间参数值正则化到午夜时间戳
  • closed:默认为None的情况下,左闭右闭,left则左闭右开,right则左开右闭

举个栗子对normalize参数进行实际运用:

rng4 = pd.date_range(start = '1/1/2017 15:30', periods = 10, name = 'hello world!', normalize = True)
print(rng4)
>>>
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10'],
              dtype='datetime64[ns]', name='hello world!', freq='D')
freq的使用(1) - 固定频率时间序列的生成

基础使用如下:

print(pd.date_range('2017/1/1','2017/1/4'))  # 默认freq = 'D':每日历日
print(pd.date_range('2017/1/1','2017/1/4', freq = 'B'))  # B:每工作日
print(pd.date_range('2017/1/1','2017/1/2', freq = 'H'))  # H:每小时
print(pd.date_range('2017/1/1 12:00','2017/1/1 12:10', freq = 'T'))  # T/MIN:每分
print(pd.date_range('2017/1/1 12:00:00','2017/1/1 12:00:10', freq = 'S'))  # S:每秒
print(pd.date_range('2017/1/1 12:00:00','2017/1/1 12:00:10', freq = 'L'))  # L:每毫秒(千分之一秒)
print(pd.date_range('2017/1/1 12:00:00','2017/1/1 12:00:10', freq = 'U'))  # U:每微秒(百万分之一秒)

进阶使用如下:

print(pd.date_range('2017/1/1','2017/2/1', freq = 'W-MON'))  
# W-MON:从指定星期几开始算起,每周
# 星期几缩写:MON/TUE/WED/THU/FRI/SAT/SUN
print(pd.date_range('2017/1/1','2017/5/1', freq = 'WOM-2MON'))  
# WOM-2MON:每月的第几个星期几开始算,这里是每月第二个星期一
freq的使用(2) - 多样化生成需要的时间序列

生成指定频率的日历日:

print(pd.date_range('2017','2018', freq = 'M'))  
print(pd.date_range('2017','2020', freq = 'Q-DEC'))  
print(pd.date_range('2017','2020', freq = 'A-DEC'))
print('------')
# M:每月最后一个日历日
# Q-月:指定月为季度末,每个季度末最后一月的最后一个日历日
# A-月:每年指定月份的最后一个日历日
# 月缩写:JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC
# 所以Q-月只有三种情况:1-4-7-10,2-5-8-11,3-6-9-12

生成指定频率的工作日:

print(pd.date_range('2017','2018', freq = 'BM'))  
print(pd.date_range('2017','2020', freq = 'BQ-DEC'))  
print(pd.date_range('2017','2020', freq = 'BA-DEC'))
print('------')
# BM:每月最后一个工作日
# BQ-月:指定月为季度末,每个季度末最后一月的最后一个工作日
# BA-月:每年指定月份的最后一个工作日

生成指定规律的特殊时间:

print(pd.date_range('2017','2018', freq = 'MS'))  
print(pd.date_range('2017','2020', freq = 'QS-DEC'))  
print(pd.date_range('2017','2020', freq = 'AS-DEC'))
print('------')
# M:每月第一个日历日
# QS-月:指定月为季度末,每个季度末最后一月的第一个日历日
# AS-月:每年指定月份的第一个日历日
print(pd.date_range('2017','2018', freq = 'BMS'))  
print(pd.date_range('2017','2020', freq = 'BQS-DEC'))  
print(pd.date_range('2017','2020', freq = 'BAS-DEC'))
print('------')
# BMS:每月第一个工作日
# BQS-月:指定月为季度末,每个季度末最后一月的第一个工作日
# BAS-月:每年指定月份的第一个工作日
freq的使用(3) - 复合频率的使用

生成指定复合频率的时间序列:

print(pd.date_range('2017/1/1','2017/2/1', freq = '7D'))  # 7天
print(pd.date_range('2017/1/1','2017/1/2', freq = '2h30min'))  # 2小时30分钟
print(pd.date_range('2017','2018', freq = '2M'))  # 每间隔2个月的第一个日历日
asfreq - 时期频率转换

以天为间隔频率的时间序列如何修改为更小单位间隔的时间序列?

ts = pd.Series(np.random.rand(4),
              index = pd.date_range('20170101','20170104'))
print(ts)
print(ts.asfreq('4H',method = 'ffill'))
# 改变频率,这里是D改为4H
# method:插值模式,None不插值,ffill用之前值填充,bfill用之后值填充
如何超前/滞后数据?

下面栗子超前/滞后的数据移动的是数值:

ts = pd.Series(np.random.rand(4),
              index = pd.date_range('20170101','20170104'))
print(ts)
print(ts.shift(2))
print(ts.shift(-2))
print('------')
# 正数:数值后移(滞后);负数:数值前移(超前)
>>>
2017-01-01    0.575076
2017-01-02    0.514981
2017-01-03    0.221506
2017-01-04    0.410396
Freq: D, dtype: float64
2017-01-01         NaN
2017-01-02         NaN
2017-01-03    0.575076
2017-01-04    0.514981
Freq: D, dtype: float64
2017-01-01    0.221506
2017-01-02    0.410396
2017-01-03         NaN
2017-01-04         NaN
Freq: D, dtype: float64

而加上freq偏移参数则偏移的的是前面的索引时间戳而不是数值:

print(ts.shift(2, freq = 'D'))
print(ts.shift(2, freq = 'T'))
# 加上freq参数:对时间戳进行位移,而不是对数值进行位移

巩固练习

  1. 作业1:请输出以下时间序列
  2. 作业2:按要求创建时间序列ts1,并转换成ts2
相关文章
|
9月前
|
数据可视化 数据挖掘 vr&ar
Data Science | Numpy基础(二)
Data Science | Numpy基础(二)
|
6月前
|
存储 数据管理 数据库
什么是计算机科学和数据管理领域的 source of truth
什么是计算机科学和数据管理领域的 source of truth
19 0
|
9月前
|
索引
Data Science | 时间序列的索引与切片
Data Science | 时间序列的索引与切片
|
9月前
|
vr&ar Python
Data Science | Numpy基础(一)
Data Science | Numpy基础(一)
Data Science | Numpy基础(一)
|
9月前
|
数据格式 Python
Data Science | Pandas基础(三)-Timestamp
Data Science | Pandas基础(三)-Timestamp
|
9月前
|
数据挖掘 数据库 索引
Data Science | Pandas基础(一)
Data Science | Pandas基础(一)
124 0
|
9月前
|
索引 Python
Data Science | Pandas基础(二)
Data Science | Pandas基础(二)
|
机器学习/深度学习 人工智能 计算机视觉
|
Shell 计算机视觉
2022亚太建模A题Feature Extraction of Sequence Images and Modeling Analysis of Mold Flux Melting and Crystallization思路分析
2022 亚太建模A题序列图像的特征提取与建模分析 模具流量的熔融和结晶Feature Extraction of Sequence Images and Modeling Analysis of Mold Flux Melting and Crystallization
2022亚太建模A题Feature Extraction of Sequence Images and Modeling Analysis of Mold Flux Melting and Crystallization思路分析
|
数据采集 人工智能 API
hands-on-data-analysis 第二单元 - 数据清洗及特征处理
数值列读取数据后,空缺值的NaN为浮点型,最好用`np.nan`判断是否是NaN。
88 0