pandas时间系列
1.时间序列前言
时间序列数据在很多领域都是重要的结构化数据形式,比如:金融,神经科学,生态学,物理学。在多个时间点观测的数据形成了时间序列。时间序列可以是固定频率的,也可以是不规则的。
常见使用
- 时间戳
- 固定的时间区间
- 时间间隔
2.时间序列基础
- 时间序列介绍
Pandas中的基础时间序列种类是由时间戳索引的Series,在Pandas外部通常表示为Python字符串或datetime对象。
2.1. Python内置时间模块
import time
2.1.1 时间戳
- 给机器看懂
- 1970年1月1日0时0分0秒到现在时间偏移量
-
time.time()
2.1.2 结构化时间
- t = time.localtime(time.time()) # 本地时间
- t
或 -
time.gmtime(time.time()) # 0 时区
-
操作时间 localtime和gmtime基本相同,只是一个是北京时间,一个是国际时间(个人理解)
2.1.3 属性
-
t.tm_year
2.1.4 格式化时间字符串
- 给人类看懂
time.strftime("%Y/%m/%d %H:%M:%S",t) - 给机器看懂
time.strptime('2021/08/12 23:18:33',"%Y/%m/%d %H:%M:%S")
2.1.5 时间戳格式化为固定的格式
其实就是把秒转换成固定的格式
- time.ctime(time.time())
-
time.ctime(1628781513.0)
2.1.6 结构化时间转回时间戳
-
time.mktime(t)
2.2. 日期模块 日期和实际数据类型
- from datetime import datetime
2.2.1 获取当前日期时间
- now = datetime.now()
-
now
2.2.2 获取属性方法
-
now.year,now.month,now.day
2.2.3 时间间隔
-
时间差timedelta(1, 68400)默认是天和秒
d = datetime(2021,12,12,20,0,0) - datetime(2021,12,11,1,0,0)
d
-
from datetime import timedelta
2.3. datetime和字符串相互转换
- stamp = datetime(2021,8,12)
-
stamp
2.3.1 datetime强制转换为字符串
-
str(stamp)
2.3.2 datetime格式化转换为字符串
- stamp.strftime("%Y-%m-%d %H:%M:%S")
-
stamp.strftime('%y/%m/%d')
2.3.3 字符串转换为datetime
- 注意:%Y一定为大写才行
- 一个转换
datetime.strptime('2021-8-13','%Y-%m-%d') -
列表转换
d = ['12/12/2021','1/1/2021']
[datetime.strptime(i,"%m/%d/%Y") for i in d]
2.3.4 补充 把不同的时间形式都转换成datetime形式
- 导入这个模块即可
from dateutil.parser import parse -
列子:2021年8月13日不同形式的字符串,导入这个模块后都可以转换成datetime形式
parse('8/13/2021')
parse('2021.8.13')
parse('2021 8 13')
parse('2021-8-13')
2.3.5 补充 转换成时间索引
-
pd.to_datetime(d)
3. 时间系列操作
3.1 索引操作
3.2 带有重复索引时间序列
3.3 日期范围 频率 移动
3.3.1 生成日期范围
- index = pd.date_range('2021-01-01','2021-03-01') # 日期起 止 默认频是天
-
index
-
pd.date_range('2021-01-01',periods=100) #日期起 条数
-
pd.date_range(end='2021-01-11',periods=100) #日期点之前100条
3.3.2 频率
-
pd.date_range('2021-08-01','2021-08-12',freq='3s')
3.3.3 移动数据
- ts.shift(2)# 下移两位
-
ts.shift(-2)# 上移两位
3.3.4 重采样
- 重采样:指得是时间序列从一个频率转换为另一个频率进行处理的过程
从高频转换到低频 --> 降采样
从低频转换到高频 --> 升采样
t.resample('M').sum()# 求各月的和
-
t.resample('10D').sum()# 求10天的和
-
升采样