偶然发现的,完全不知道原因是什么
# 导入如下数据框
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中。