前言
在金融、经济、物理学等领域,都需要在多个时间点观测或者测量数据,这样就产生了关于时间序列的数据。
时间序列数据(Time Series Data)是在不同时间上收集到的数据,这类数据是按时间顺序收集到的,用于描述现象随时间变化的情况。
很不巧,Pandas为我们提供了强大的时间序列数据处理的方法。
1️⃣datetime模块
Python标准库包含了日期和时间数据的数据类型,datetime模块是开始处理时间数据最广泛的。
# 创建时间 import datetime time = datetime.time(13, 14, 20) print(time) # 获取小时 print(time.hour) # 获取分钟 print(time.minute) # 获取秒 print(time.second)
时间(time)类型的使用:
# 创建时间 import datetime time = datetime.time(13, 14, 20) print(time) # 获取小时 print(time.hour) # 获取分钟 print(time.minute) # 获取秒 print(time.second)
日期和时间的结合体–日期时间(datetime):
import datetime # 创建日期时间 datetime = datetime.datetime(2019, 9, 9, 13, 14, 20) print(datetime) # 获取年 print(datetime.year) # 获取月 print(datetime.month) # 获取日 print(datetime.day) # 获取小时 print(datetime.hour) # 获取分钟 print(datetime.minute) # 获取秒 print(datetime.second)
datetime的time方法可以创建时间,date方法可以创建日期,datetime方法则是日期和时间的结合体。
通过year、month、day、hour、minute、second属性,可以获取到相应的日期或者时间的值。
同样,使用datetime.now()方法可以获取到当前时间
🚩上面这些代码,大家自己尝试运行,这里不做演示了,so easy
现在我们知道如何使用datetime模块创建时间,但是有些时候我们可能需要将datetime类型转成字符串样式。
例如:将字符串类型的Aug-23-19 20:13转化成2019-08-23 20:13:00样式的datetime类型
import datetime strp = datetime.datetime.strp time('may-23-19 20:13', '%b-%d-%y %H:%M') print(strp)
✨效果
2019-05-23 20:13:00
有的小伙伴会问道:“datetime.datetime(2019, 9, 9, 13, 14, 20)输出的的结果不就是2019-9-9 13:14:20吗?为什么还需要变?”。
没错,它的结果就是我们想要的样式,但是,需要注意的是它的类型是datetime,并不是str。
如果我们只是单一的想改变类型,就可以使用强制类型转换:
import datetime date_time = datetime.datetime(2019, 9, 9, 13, 14, 20) print(type(date_time)) str_date_time = str(date_time) print(str_date_time) print(type(str_date_time))
✨效果
<class ‘datetime.datetime’>
2019-09-09 13:14:20
<class ‘str’>
但是,我想提一个需求:将datetime.datetime(2019, 9, 9, 13, 14, 20)转换成9/9/2019 13:14样式的字符串。
2️⃣strftime()方法
莫慌,使用strftime()方法便可解决
import datetime date_time = datetime.datetime(2019, 9, 9, 13, 14, 20) str_time = date_time.strftime('%m/%d/%Y %H:%M') str_time
关于时间格式的汇总如下图
那么如何将str类型转化成datetime类型。
3️⃣strptime()方法
例如:将字符串类型的Aug-23-19 20:13转化成2019-08-23 20:13:00样式的datetime类型。 同理,使用strptime()方法。
import datetime strp = datetime.datetime.strptime('Aug-23-19 20:13', '%b-%d-%y %H:%M') print(strp) print(type(strp))
🚩strptime()方法的作用是字符串时间转化为datetime格式,需要注意的是按一定的格式输出时间。
例如:第二个参数不可写成%B-%d-%Y %H:%M ,或者%b / %d / %Y %H:%M
Pandas时间序列基础
前面我们了解了Python内置的datetime模块对时间和日期的处理方法,接下来我们看一下Pandas处理时间上有哪些方法。
使用Pandas的date_range()方法可以快速创建出一个日期范围。
pd.date_range(start=None,end=None,periods=None,freq="D")
- start:日期范围的开始;
- end:日期范围的结束;
- periods:固定日期的个数;
- freq:日期偏移量,取值为string,
默认为’D’,即:一天为日期偏移量
import pandas as pd import time #使用start和periods以及默认的频率参数创建: dat = pd.date_range(start='20010919', periods=10, freq="D") #使用start和end以及频率参数freq为10天创建: date = pd.date_range(start='20190808', end='20190921', freq="10D") print(date) print(dat)
✨效果
start和end以及freq配合能够生成start和end范围内以频率freq的一组时间索引。
start和periods以及freq配合能够生成从start开始的频率为freq的periods个时间索引。
关于频率的更多缩写:
有时候我们会对一天或者一个月的数据进行分析,这就需要我们将时间设置成数据的索引,然后通过时间索引获取到一定时间范围内的数据进行分析。
现在我们创建一个以时间序列为索引的Series数据。
import pandas as pd time_index = pd.date_range('2019-01-01', periods=365) print(time_index)
然后,使用numpy的随机数创建365个随机整数:
import numpy as np time_data = np.random.randint(100,size=365)
import pandas as pd import numpy as np time_index = pd.date_range('2019-01-01', periods=400) time_data = np.random.randint(100,size=400) date_time = pd.Series(data=time_data,index=time_index) print(date_time)
效果
现在已经成功创建出数据,并将时间索引值设置成数据的索引项,接下来的重点是如何根据时间序列索引获取数据呢?
可以依据年份进行索引
date_time['2020']
可以依据年和月进行索引
date_time['2019-10']
可以使用时间戳进行切片获取数据
date_time['2019-10-05':'2019-10-10']
🚩在获取数据的时候可以直接使用字符串的形式获取以及切片操作。
有的时候用csv导入到时间数据时,默认的是字符串的数据类型
,当可视化的时候,会出现没有按时间先后顺序的方式绘图 ,所以需要将字符串解析为时间类型的数据类型。
pd.to_datetime(arg,format=None)
- arg:需要修改的数据
- format:数据的格式
- to_datetime()方法会将字符串类型的是时间转换成Timestamp(‘2019-10-05 00:00:00’)时间戳类型。
✨效果
如果想对时间格式修改,还可以使用to_pydatetime()方法将Timestamp类型转换成datetime类型。
pd.to_datetime('2019-10-05').to_pydatetime()
需要注意的是字符串日期中包含中文,我们可以这样处理
pd.to_datetime('2019年10月10日',format='%Y年%m月%d日')