在数据帧中使用strptime进行时间格式化



我正在尝试读取CSV文件,其中一些列具有日期或时间值。

我是这样开始的:

import pandas as pd
from datetime import datetime
timeparse = lambda x: datetime.strptime(x, '%H:%M:%S.%f')
lap_times = pd.read_csv(
'data/lap_times.csv',
parse_dates={'time_datetime': ['time']}, 
date_parser=timeparse
)

但有时列的行具有%M:%S.%f格式,有时具有%H:%M:%S.%f格式。所以我得到了一个错误。

我考虑过创建这样一个函数,但是我不知道如何向函数传递一个参数来对作为参数传递的列的每一行进行转换。

def timeparse_1():
try:
return datetime.strptime(x, '%H:%M:%S.%f')
finally:
return datetime.strptime(x, '%M:%S.%f')

但是我得到:

NameError: name 'x' is not defined

如果您发布CSV文件的示例会更容易,但这样的事情可能会起作用:

import pandas as pd
from datetime import datetime as dt
df = pd.DataFrame({'Time': ['12:34:56', '12:34:56.789']})
df.Time = df.Time.apply(lambda x: dt.strptime(x, '%H:%M:%S.%f') if len(x) > 8 else dt.strptime(x, '%H:%M:%S'))

这将导致:

>>> df
0   1900-01-01 12:34:56.000
1   1900-01-01 12:34:56.789
Name: Time, dtype: datetime64[ns]
>>> 

但是有一个更好的方法:

import pandas as pd
df = pd.DataFrame({'Time': ['12:34:56', '12:34:56.789']})
df.Time = df.Time.apply(pd.to_datetime)

结果如下:

>>> df
0   2022-11-20 12:34:56.000
1   2022-11-20 12:34:56.789
Name: Time, dtype: datetime64[ns]
>>>

使用今天完成datetime对象。

最新更新