一、把字符串转换成日期
使用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")