数据预处理时会遇到时间和日期(datetime)类型的数据,pandas中的时间序列工具能够对datetime类型的数据进行处理
链接:https://pan.baidu.com/s/1UOI7XmtiX8fg7zUveXoCeg
提取码:cz1e
7.1 把字符串转换成日期
pandas的to_datetime函数能够将字符串类型的日期转换成datetime型
import numpy as np
import pandas as pd
#创建字符串
date_strings = np.array(['03-04-2005 11:35 PM','23-05-2010 12:01 AM','04-09-2009 09:09 PM'])
# 转换成datetime类型的数据
[pd.to_datetime(date,format='%d-%m-%Y %I:%M %p') for date in date_strings]
format参数指定字符串的时间和日期格式
代码 描述 例子
%Y 完整的年份 2001
%m 月,首位空缺时需要0填充 04
%d 日,首位空缺时需要0填充 09
%I 小时,首位空缺时需要0填充 02
%p AM(上午),PM(下午) AM
%M 分,首位空缺时需要0填充 05
%S 秒,首位空缺时需要0填充 09
设置参数errors=“coerce”,当遇到错误时不会抛出错误,但是会将导致这个错误的值设置为NaN
时间和日期为字符串类型的时候,会导致格式不统一,例如:08-23-12;08|23|12;
通常转换要将字符串类型的时间和日期通过设置format参数转换成datetime类型的时间和日期。
[pd.to_datetime(date,format="%d-%m-%Y %I:%M %p",errors="coerce")for date in date_strings]
7.2 处理时区
为一组时间序列数据添加或者改变时区
如果没有特别指定,pandas的对象都是没有时区的,但是在创建对象时通过tz参数指定时区
import pandas as pd
#创建datetime
pd.Timestamp('2017-05-01 06:00:00',tz='Europe/London')
# 使用tz_localize为之前创建的datetime对象添加时区信息
#创建datetime
date = pd.Timestamp('2017-05-01 06:00:00')
#设置时区
date_in_london = date.tz_localize('Europe/London')
#查看datetime
date_in_london
# 还可以转换时区
date_in_london.tz_convert('Africa/Abidjan')
# pandas的Series对象能对每一个元素应用tz_localize和tz_convert
#创建3个日期
dates = pd.Series(pd.date_range('2/2/2002',periods=3,freq='M'))
#设置时区
dates.dt.tz_localize('Africa/Abidjan')
# 查看所有的时区字符串
from pytz import all_timezones
all_timezones[0:2]
7.3 选择日期和时间
从一组日期向量中选择一个或多个日期值
# 使用两个布尔条件句子分别bin置开始日期和结束日期
import pandas as pd
#创建数据帧
dataframe = pd.DataFrame()
#创建datetime
dataframe['date'] = pd.date_range('1/1/2001',periods=100000,freq='H')
#筛选出两个日期之间的观察值
dataframe[(dataframe['date']>'2002-1-1 01:00:00')&(dataframe['date']<='2002-1-1 04:00:00')]
# 将date(日期)这一列设为数据帧的索引列,然后用loc进行筛选:
dataframe = dataframe.set_index(dataframe['date'])
#选择两个日期之间的观察值
dataframe.loc['2002-1-1 01:00:00':'2002-1-1 04:00:00']
7.4 将日期数据切分成多个特征
用一列日期和时间数据来创建年、月、日、时、分的特征
# 使用pandas函数Series.dt的时间属性
import pandas as pd
dataframe = pd.DataFrame()
#创建5个日期
dataframe['date'] = pd.date_range('1/1/2001',periods=150,freq='W')
#创建年、月、日、时和分的特征
dataframe['year'] = dataframe['date'].dt.year
dataframe['month'] = dataframe['date'].dt.month
dataframe['day'] = dataframe['date'].dt.day
dataframe['hour'] = dataframe['date'].dt.hour
dataframe['minute'] = dataframe['date'].dt.minute
dataframe.head()
7.5 计算两个日期之间的时间差
为每个观察值计算两个日期特征之间的时间差
# 使用pandas对两个日期特征做减法
import pandas as pd
#创建数据帧
dataframe = pd.DataFrame()
#创建两个datetime特征
dataframe['Arrived'] = [pd.Timestamp('01-01-2017'),pd.Timestamp('01-04-2017')]
dataframe['Left'] = [pd.Timestamp('01-01-2017'),pd.Timestamp('01-06-2017')]
#计算两个特征之间的时间间隔
dataframe['Left']-dataframe['Arrived']
#移除输出中的days标签,仅留下数值
pd.Series(delta.days for delta in (dataframe['Left']-dataframe['Arrived']))
7.6 对一周内的各天进行编码
求一个日期向量中的每一个日期是星期几
# 使用pandas中的Series.dt的weekday_name属性
import pandas as pd
dataframe = pd.DataFrame()
#创建日期
dates = pd.Series(pd.date_range("2/2/2002",periods=3,freq="M"))
#查看星期几
dates.dt.weekday_name
7.7 创建一个滞后的特征
创建一个滞后n个时间段的特征
# 使用pandas的shift
import pandas as pd
dataframe = pd.DataFrame()
#创建数据
dataframe["dates"] = pd.date_range("1/1/2001",periods=5,freq="D")
dataframe["stock_price"]=[1.1,2.2,3.3,4.4,5.5]
#让值滞后一行
dataframe["previous_days_stock_price"] = dataframe["stock_price"].shift(1)
dataframe
滞后一行数据是为了使用历史数据做预测。例如,使用前一天的股票价格来预测今天的价格。因为没有前一天的stock_price,所以previous_days_stock_price的第一行是一个缺失值。
7.8 使用滚动时间窗口
计算一个时间序列数据针对某个滚动时间的统计量
rolling主要作用是根据时间(天、月、季度、年等)观察数据的变化趋势,是下降了还是上升了,最后还要分析趋势的元婴,结合业务逻辑去分析。
import pandas as pd
#创建datetime
time_index = pd.date_range("01/01/2010",periods=5,freq="M")
#创建数据帧,设置索引
dataframe = pd.DataFrame(index=time_index)
#创建特征
dataframe["Stock_Price"] = [1,2,3,4,5]
#计算滚动平均值(window=2,就是计算连续两个值(当前这个+前面一个))
dataframe.rolling(window=2).mean()
7.9 处理时间序列中的缺失值
针对时间序列数据,可以使用插值法填充缺失值造成的数据缺口
import pandas as pd
import numpy as np
#创建日期
time_index = pd.date_range("01/01/2010",periods=5,freq="M")
#创建数据帧,设置索引
dataframe = pd.DataFrame(index=time_index)
#创建带缺失数据的特征
dataframe["Sales"] = [1.0,2.0,np.nan,np.nan,5.0]
#对缺失数据进行插值
dataframe.interpolate()
#使用前面的值来替换缺失值
dataframe.ffill()
#使用后面的值来替换缺失值
dataframe.bfill()
插值法:由于缺失值造成的数据缺口的技术。利用缺口附近已知数画一条直线或曲线,然后根据线段预测缺失值。
适用于:时间间隔确定,数据不会产生剧烈波动且缺失值缺口比较小的时候
如果认为两个已知点之间的线是非线性的,可以使用interpolate的method参数来指定插值的方式
dataframe.interpolate(method="quadratic")
如果缺失值的缺口非常大,不想对整个缺口进行插值。可以使用limit来限制插值的数量,并用limit_direction来设置是从最后一个已知值进行向前插值,还是进行反向的操作。
dataframe.interpolate(limit=1,limit_direction="forward")
向前插值和向后填充是简单的插值法,画一条线经过已知值的线,利用这条线来填充缺失值。
向后填充和向前填充还有一个小优点,即不需要知道缺失值两侧的值
收工!!!