# Classify date column by format type
df['format'] = 1
df.loc[df.date.str.contains('/'), 'format'] = 2
df['new_date'] = pd.to_datetime(df.date)
# Convert to datetime with two different format settings
df.loc[df.format == 1, 'new_date'] = pd.to_datetime(df.loc[df.format == 1, 'date'], format = '%Y-%d-%m %H:%M:%S').dt.strftime('%Y-%m-%d')
df.loc[df.format == 2, 'new_date'] = pd.to_datetime(df.loc[df.format == 2, 'date'], format = '%m/%d/%Y %H:%M:%S %p').dt.strftime('%Y-%m-%d')
print(df)
date format new_date
0 3/14/2019 5:15:32 AM 2 2019-03-14
1 2019-08-03 05:15:35 1 2019-03-08
2 2019-01-03 05:15:33 1 2019-03-01
3 2019-01-03 05:15:33 1 2019-03-01
4 2/28/2019 5:15:31 AM 2 2019-02-28
5 2/27/2019 11:18:39 AM 2 2019-02-27
5条答案
按热度按时间wqnecbli1#
您可以使用
pd.to_datetime().dt.strftime()
将整个列有效地转换为datetime对象,然后转换为字符串,Pandas智能地猜测日期格式:如果这不能给予你想要的,你将需要识别不同类型的格式,并在将它们转换为datetime对象时应用不同的设置:
disho6za2#
假设DataFrame中的列名为
DatStr
。成功的关键是一个合适的转换函数,应用于每个日期字符串:
然后,要创建一个真正的日期列,你需要做的就是调用:
打印DataFrame时,结果为:
请注意,
to_datetime
函数足够聪明,可以识别每种情况下使用的实际日期格式。dphi5xsq3#
我也遇到过类似的问题。幸运的是,每隔一行都会出现不同的格式。因此,我可以轻松地使用
.iloc
进行切片。然而,您也可以使用.loc
和过滤器(检测每种格式)对系列进行切片。然后你可以用
pd.concat
合并行。顺序将与DataFrame的其余部分相同(如果你分配了它)。如果有缺失的索引,它们将变成NaN,如果有重复的索引,pandas将引发错误。hvvq6cgz4#
pandas〉= 2.0:
to_datetime
可以使用format='infer'
推断多种日期时间格式代表性示例:
请注意文档中的警告:
“mixed”,用来分别推断每个元素的格式。这是有风险的,你应该和dayfirst一起使用
在上面的示例数据中,月份和月份的日期非常清楚,但并非所有数据都是如此。如果您认为
to_datetime
不能可靠地推断日期,则可以根据日期是否总是在混合格式中的第一个添加dayfirst=True/False
,或者找到其他手动方法(或者更好的是,修复数据源!)vmdwslir5#
我想这个答案有点晚了,但我发现了一个更简单的方法来做同样的事情