机器学习案例——‘线性回归预测家庭用电与时间关系‘ 中格式化时间字符串问题

在机器学习的线性回归案例**“家庭用电案例”**中遇到的问题,自己记录下来。

// 需求:把数据集中,字符串类型的时间信息------>数字类型,保存成样本集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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值