在机器学习的线性回归案例**“家庭用电案例”**中遇到的问题,自己记录下来。
// 需求:把数据集中,字符串类型的时间信息------>数字类型,保存成样本集X
# 创建一个时间函数 格式化字符串
def date_format(dt):
t = time.strptime(' '.join(dt),'%d/%m/%Y %H:%M:%S')
return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
X = datas.iloc[:,:2]
print(X)
# 应用DataFrame的apply函数,axis=1,就会把一行数据作为Series的数据结构传入给自己实现的函数中
X = X.apply(lambda x: pd.Series(date_format(x)),axis=1)
// 其中X = datas.iloc[:,:2] # 取出数据集中的时间信息 打印如下
Date Time
0 16/12/2006 17:24:00
1 16/12/2006 17:25:00
2 16/12/2006 17:26:00
3 16/12/2006 17:27:00
4 16/12/2006 17:28:00
.. ... ...
995 17/12/2006 09:59:00
996 17/12/2006 10:00:00
997 17/12/2006 10:01:00
998 17/12/2006 10:02:00
999 17/12/2006 10:03:00
—————————————————————————————————————————————
知识点1
构建的date_format()函数:
Python time strptime() 函数根据指定的格式把一个时间字符串解析为时间元组,返回struct_time对象。
import time
struct_time = time.strptime("30 Nov 00", "%d %b %y")
print("返回的元组: %s " % struct_time)
知识点2
关于’ '.join()用法,已经在之前的文章中总结了
Python join()简单范例用法
按理说已经很清晰了,但是有一点小细节问题
X.apply(lambda x: pd.Series(date_format(x)),axis=1)
⚠️DataFrame.apply(fun,axis=1) 是把一行数据作为Series传入函数fun,而pd.Series中的数据类型dtype是object,比如可以试验一下:
print(X.iloc[0,:])
// 打印如下
Date 16/12/2006
Time 17:24:00
Name: 0, dtype: object
dataframe的字符类型dtype为object,不为str
也就是说传入 date_format() 的参数是pd.Series 其中元素为 字符串 ‘17/12/2006’,‘17:24:00’
// 测试 'sep'.join(seq) 这个seq除了列表、元组、字典之外,还能不能是 pd.Series?
se = pd.Series(['18/4/2022','16:04:04'],name='Date Time')
print(se)
time = time.strptime(' '.join(se),'%d/%m/%Y %H:%M:%S')
print(time)
# 证明其实 'sep'.join(seq)还可以处理pd.Series
运行结果如下
0 18/4/2022
1 16:04:04
Name: Date Time, dtype: object
time.struct_time(tm_year=2022, tm_mon=4, tm_mday=18, tm_hour=16, tm_min=4, tm_sec=4, tm_wday=0, tm_yday=108, tm_isdst=-1)
—————————————————————————————————————————————
流程总结:
X.apply(lambda x : pd.Series(date_format(x)),axis=1) 把自己每一行作为pd.Series传入date_format()
date_format()中的’ ‘.join()对传入的每一行Series,(比如 ‘17/12/2006’,‘17:24:00’)两个字符串添加了空格’ ‘分隔符,并生成了新的字符串’17/12/2006 17:24:00’
time.strptime(新的字符串,’%d/%m/%Y【空格】%H:%M:%S’)把时间信息提取出来,返回包含时间信息
tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst 的元组time.struct_time
lambda x : pd.Series(…) 最后把time.struc_time元组变成Series返回,对原有的X每一行都这样操作
最后就实现了 字符串类型的时间信息样本集------>数字类型的样本集
Date Time 0 1 2 3 4 5
0 16/12/2006 17:24:00 0 2006 12 16 17 24 0
1 16/12/2006 17:25:00 1 2006 12 16 17 25 0
2 16/12/2006 17:26:00 ------> 2 2006 12 16 17 26 0
3 16/12/2006 17:27:00 3 2006 12 16 17 27 0
4 16/12/2006 17:28:00 4 2006 12 16 17 28 0