Python机器学习手册(七)

数据预处理时会遇到时间和日期(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")

在这里插入图片描述
向前插值和向后填充是简单的插值法,画一条线经过已知值的线,利用这条线来填充缺失值。
向后填充和向前填充还有一个小优点,即不需要知道缺失值两侧的值

收工!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值