我有以下for循环,可将列中的所有值转换为日期时间格式,并使用errors ='coerce'处理不符合日期时间格式的任何值:
mockito-scala
但是,要尝试进行列表理解,我想将其转换,但是我什么也没得到。
我尝试了以下操作:
scalamock
但是它不起作用。
谢谢!
答案 0 :(得分:3)
我认为这里是更好,更轻松的第一个解决方案,例如列表理解。
或使用DataFrame.apply
:
df[datecols] = df[datecols].apply(pd.to_datetime,errors='coerce')
df[datecols] = df[datecols].apply(lambda x: pd.to_datetime(x,errors='coerce'))
可以使用列表理解的解决方案-值由DataFrame.pop
提取,由concat
连接在一起,也使用相同的列顺序(如有必要)DataFrame.reindex
:
df = pd.DataFrame({'Date_1':['2020-05-01','2020-06-02','2020-02-30'],
'Date_2':['1999-02-01','2000','2005-10-52'],
'col1':list('abc')})
print (df)
Date_1 Date_2 col1
0 2020-05-01 1999-02-01 a
1 2020-06-02 2000 b
2 2020-02-30 2005-10-52 c
datecols = ['Date_1','Date_2']
cols = df.columns
df1 = pd.concat([pd.to_datetime(df.pop(x),errors='coerce') for x in datecols], axis=1)
df = df.join(df1).reindex(cols, axis=1)
print (df)
Date_1 Date_2 col1
0 2020-05-01 1999-02-01 a
1 2020-06-02 2000-01-01 b
2 NaT NaT c
答案 1 :(得分:0)
这里的问题是列表理解将很难将列中的值重新分配给数据框。无论如何,您都可以用它重新创建数据框,但是列表理解本身并不能解决问题:
df = pd.DataFrame({'Date_1':['2020-05-01','2020-06-02','AAA'],
'Date_2':['19990201','20000101','20051012']})
原始数据框:
Date_1 Date_2
0 2020-05-01 19990201
1 2020-06-02 20000101
2 AAA 2005101
建议的解决方案:
pd.DataFrame([pd.to_datetime(df[x],errors='coerce',infer_datetime_format=True) for x in df]).T
输出:
Date_1 Date_2
0 2020-05-01 1999-02-01
1 2020-06-02 2000-01-01
2 NaT 2005-10-12
答案 2 :(得分:0)
如果您确实想要list
理解,那么您必须接受一个事实,即您将获得list
,因此没有list
理解代码会真正等效回到您的原始循环。
但是,类似的代码可能看起来像这样:
[pd.to_datetime(df[x], errprs='coerce') for x in datecols]
但实际上看起来您可能想要使用其他方法,例如@jezrael answer中的建议。