处理日期和时间

一、把字符串转换成日期

使用pandas的to_datetime函数,并通过format参数指定字符串的日期和时间格式

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'])
[pd.to_datetime(date,format='%d-%m-%Y %I:%M %p') for date in date_strings]

还可以增加一个errors参数来处理错误:

[pd.to_datetime(date,format='%d-%m-%Y %I:%M %p',errors="coerce") 
for date in date_strings]

二、处理时区

如果没有特别指定,pandas 的对象都是没有时区的,不过可以在创建对象时通过tz参数来指定时区:

import pandas as pd
pd.Timestamp('2017-05-01 06:00:00',tz='Europe/London')
date=pd.Timestamp('2017-05-01 06:00:00')
date_in_london=date.tz_localize('Europe/London')
date_in_london

还可以转换时区:

date_in_london.tz_convert('Africa/Abidjan')

最后,pandas的Series对象能对每一个元素应用tz_loccalize和tz_convert:

#创建3个对象
dates=pd.Series(pd.date_range('2/2/2002',periods=3,freq='M'))
dates.dt.tz_localize('Africa/Abidjan')

pandas支持两种表示时区的字符串,但还是建议使用pytz库的字符串。导入all_timezones库就能看到所有代表时区的字符串:

from pytz import all_timezones
all_timezones[0:2]

三、选择日期和时间

使用两个布尔条件句分别设置开始日期和结束日期:

import pandas as pd
dataframe=pd.DataFrame()
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这一列设为DateFrame的索引列,然后用loc进行筛选:

dataframe=dataframe.set_index(dataframe['date'])
#选择两个日期之间的观察值
dataframe.loc['2002-1-1 01:00:00':'2002-1-1 04:00:00']

如果是执行复杂的时间序列操作,将date这一列设置为DateFrame的索引是值得的:但如果只想做一些简单的数据整理工作,那么使用布尔条件句会更简单一些。

四、将日期数据切分成多个特征

import pandas as pd
dataframe=pd.DataFrame()
dataframe['date']=pd.date_range('1/1/2001',periods=150,freq='W')
dataframe['month']=dataframe['date'].dt.month
dataframe['year']=dataframe['date'].dt.year
dataframe['day']=dataframe['date'].dt.day
dataframe['hour']=dataframe['date'].dt.hour
dataframe['minute']=dataframe['date'].dt.minute
dataframe.head(3)

五、计算两个日期之间的时间差

import pandas as pd
dataframe=pd.DataFrame()
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']))

六、对一周内的各天进行编码

使用pandas中Series.dt的weekday_name属性:

import pandas as pd
dates=pd.Series(pd.date_range("2/2/2002",periods=3,freq="M"))
dates.dt.day_name()

如果希望输出是一个数值。以便其成为一个更有用的机器学习特征,则可以使用weekday属性。

import pandas as pd
dates=pd.Series(pd.date_range("2/2/2002",periods=3,freq="M"))
dates.dt.weekday

 

七、创建一个滞后的特征

使用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

八、使用滚动时间窗口

import pandas as pd
time_index=pd.date_range("01/01/2010",periods=5,freq="M")
dataframe=pd.DataFrame(index=time_index)
dataframe["Stokck_Price"]=[1,2,3,4,5]
dataframe.rolling(window=2).mean()

假设我们对股票价格的观察值是以月为单位的。如果拥有一个确定月份数量的时间窗口,并且在所有的观察值移动这个窗口,那么计算时间窗口中所有观察值的统计量是很有价值的。

滚动平均值常被用于对时间序列数据做平滑处理,因为使用整个时间窗口的平均值能削弱短期波动的影响。

九、处理时间序列中的缺失值

针对时间序列的数据,还可以使用插值法来填充由缺失值造成的数据缺口:

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、付费专栏及课程。

余额充值