错题集(已解决):在字符-日期时间-struct_time格式转换中报ValueError的有趣错误

本文探讨了在使用Pandas进行时间数据转换时遇到的特殊问题,特别是在将datetime转换为time.struct_time格式并尝试将其存储回DataFrame时所遇到的错误。通过对比不同转换方法的效果,分析了错误产生的原因,并提出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

偶然发现的,完全不知道原因是什么

# 导入如下数据框
dtf = pd.DataFrame([{"A":'1992-02-04',"B":'2'},{"A":'1992-02-05',"B":'2'}])
# 直接一步将完成"字符串 -> datetime.datetime -> time.struct_time"则无报错,结果没有任何问题
dtf['D'] = dtf.apply(lambda x: datetime.datetime.strptime(x['A'],'%Y-%m-%d').timetuple(), axis=1)

在这里插入图片描述

# 但是如果按照如下分布完成,则会报错
dtf = pd.DataFrame([{"A":'1992-02-04',"B":'2'},{"A":'1992-02-05',"B":'2'}])
dtf['D'] = dtf.apply(lambda x: datetime.datetime.strptime(x['A'],'%Y-%m-%d'), axis=1)
# 此步正常,返回datetime.datetime格式的列'D'
dtf['E'] = dtf.apply(lambda x: x['D'].timetuple(), axis=1)
# 此步报错

在这里插入图片描述报错信息:

ValueError: Shape of passed values is (2, 9), indices imply (2, 3)
暂时还没有想到这是个什么问题··· 感觉和 apply 有关


更新:
使用如下代码,进而排除apply的原因,基于同样的原因报了一个新错

dtf = pd.DataFrame([{"A":'1992-02-04',"B":'2'},{"A":'1992-02-05',"B":'2'}])
for i in range(len(dtf)):
    dtf.loc[i,'D'] = datetime.datetime.strptime(dtf.loc[i,'A'],'%Y-%m-%d')
for i in range(len(dtf)):
    dtf.loc[i,'E'] = dtf.loc[i,'D'].timetuple()  # 此步报错

在这里插入图片描述

意思大概是time.struct_time在生成的时候是被当作一个序列的,并不能这样直接塞进DataFrame的一个单元格内,就搞不懂为什么直接一部到位的话又可以把time.struct_time放进单元格里了····
从这里也可以理解上一个报错中的"Shape of passed values is (2, 9)"是什么意思了,因为一个timeTuple刚好是一个长度为9的序列,不能被装进本DataFrame中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值