之前参加了datafountain的比赛,虽然没有拿到什么好的名次,但是通过自己的学习和别人的讨论,对于数据挖掘比赛中的对于时间的处理稍微整理下,首先对于时间的格式,一般情况下是给出年月如时分秒,我们需要做的是对于时间进行处理,需要明白的是一般情况下对我们有用的就是月份,一个月中的天数,一天中的小时,因为分钟和秒容易造成过拟合,对这些信息进行提取出来,然后构造新的特征。
TIME
2018-03-22 16:31:44
上面是一般情况下给出的时间的格式。我们需要做的就是将上面时间中的月份,一个月中的天数和最后的时间提取出来,至于分钟的秒钟视情况而定,一般情况下是不需要的,因为这样会导致训练样本的过拟合,从而在测试样本中的效果不好。可以用两种方法来做:
第一种方法:首先得到的Dataframe中的这一列Dataframe['TIME'],注意需要加单引号。然后调用map这个内置的隐射函数,这里的map是对Dataframe中的每一个元素进行映射,然后在map()内部设置函数,这里用的是匿名函数lambda x,然后在匿名函数内部用datetime模块中的datetime类中的strftime函数,将时间字符串转换变成时间元组的格式了,如
map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S")
strptime中的后面的参数表示的是前面的x需要转换的格式,关于这里的设置问题,查看datetime模块链接,然后对得到的时间元组的格式来得到day,hour,month等,这里需要特殊注意的是weekend(),此函数可以得到这一天是周几,具体如下
Datatime['week'] = Datatime['Datatime'].map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S").weekday()
Datatime['day'] = Datatime['Datatime'].map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S").day)
Datatime['hour'] = Datatime['Datatime'].map(lambda x: time_of_day[datetime.strptime(x, "%Y-%m-%d %H:%M:%S").hour])
这样就可以提取出来了上面列中的day,weekend,hour等信息
第二种方法:直接选择Dataframe中的TIME列,然后直接调用函数apply,在内部使用函数lambda x,因为x是字符串所以直接对x中的字符进行选择,得到day,hour,如下
Dataframe['day'] = Dataframe['TIME'].apply(lambda x: int(x[8:10]))
Dataframe['hour'] = Dataframe['TIME'].apply(lambda x: int(x[11:13]))
但是这里无法得到星期几,我们可以设置函数来定义,如对得到的day这一列来进行计算,假如是2018年的三月,那么可以来进行设置,首先需要知道三月是从星期四开始,所以得到的
def get_week(Dataframe):
day = int(day)
weekend=day%7+3
return weekend
转载请说明出处