我有一个类似的pandas.dataframe('col'列有两种格式):
col val
'12/1/2013' value1
'1/22/2014 12:00:01 AM' value2
'12/10/2013' value3
'12/31/2013' value4
我想把它们转换成日期时间,我正在考虑使用:
test_df['col']= test_df['col'].map(lambda x: datetime.strptime(x, '%m/%d/%Y'))
test_df['col']= test_df['col'].map(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M %p'))
显然,它们中的任何一个都适用于整个df。我正在考虑使用try-and-except,但没有得到任何运气,有什么建议吗?
只需使用to_datetime
,它就足以处理这两种格式:
In [4]:
df['col'] = pd.to_datetime(df['col'])
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 2 columns):
col 4 non-null datetime64[ns]
val 4 non-null object
dtypes: datetime64[ns](1), object(1)
memory usage: 96.0+ bytes
df现在看起来是这样的:
In [5]:
df
Out[5]:
col val
0 2013-12-01 00:00:00 value1
1 2014-01-22 00:00:01 value2
2 2013-12-10 00:00:00 value3
3 2013-12-31 00:00:00 value4
我在同一列Temps
中有两种不同的日期格式,类似于OP,如下所示;
01.03.2017 00:00:00.000
01/03/2017 00:13
对于两个不同的代码片段,时间安排如下;
v['Timestamp1'] = pd.to_datetime(v.Temps)
耗时25.5408718585968秒
v['Timestamp'] = pd.to_datetime(v.Temps, format='%d/%m/%Y %H:%M', errors='coerce')
mask = v.Timestamp.isnull()
v.loc[mask, 'Timestamp'] = pd.to_datetime(v[mask]['Temps'], format='%d.%m.%Y %H:%M:%S.%f',
errors='coerce')
耗时0.2923243045806885秒
换句话说,如果您的日期时间有少量已知格式,请不要在没有格式的情况下使用to_datetime!
您可以创建一个新列:
test_df['col1'] = pd.Timestamp(test_df['col']).to_datetime()
然后删除col并重命名col1。
它对我有用。我的专栏"fecha_hechos"中有两种格式。其中的格式:
- 2015年3月2日
- 2010年2月10日
我做的是:
carpetas_cdmx['Timestamp'] = pd.to_datetime(carpetas_cdmx.fecha_hechos, format='%Y/%m/%d %H:%M:%S', errors='coerce')
mask = carpetas_cdmx.Timestamp.isnull()
carpetas_cdmx.loc[mask, 'Timestamp'] = pd.to_datetime(carpetas_cdmx[mask]['fecha_hechos'], format='%d/%m/%Y %H:%M',errors='coerce')
是:carpetas_cdmx
是我的DataFrame和fecha_hechos
,我的格式为