如何使用 null 将字符串转换为日期时间 - python, pandas?

How to convert string to datetime with nulls - python, pandas?

提问人:Colin O'Brien 提问时间:3/27/2015 最后编辑:Julien MarrecColin O'Brien 更新时间:11/27/2017 访问量:72821

问:

我有一个系列,其中包含一些日期时间(作为字符串)和一些空值作为“nan”:

import pandas as pd, numpy as np, datetime as dt
df = pd.DataFrame({'Date':['2014-10-20 10:44:31', '2014-10-23 09:33:46', 'nan', '2014-10-01 09:38:45']})

我正在尝试将这些转换为日期时间:

df['Date'] = df['Date'].apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))

但是我收到错误:

time data 'nan' does not match format '%Y-%m-%d %H:%M:%S'

所以我试着把这些变成实际的空值:

df.ix[df['Date'] == 'nan', 'Date'] = np.NaN

并重复:

df['Date'] = df['Date'].apply(lambda x: dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))

但后来我收到错误:

必须是字符串,而不是浮点

解决这个问题的最快方法是什么?

python 字符串 datetime pandas 类型转换

评论


答:

62赞 EdChum 3/27/2015 #1

只需使用 to_datetime 并设置即可处理 duff 数据:errors='coerce'

In [321]:

df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
df
Out[321]:
                 Date
0 2014-10-20 10:44:31
1 2014-10-23 09:33:46
2                 NaT
3 2014-10-01 09:38:45

In [322]:

df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 1 columns):
Date    3 non-null datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 64.0 bytes

调用的问题在于,如果字符串或 dtype 不正确,它将引发错误。strptime

如果你这样做了,那么它会起作用:

In [324]:

def func(x):
    try:
        return dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    except:
        return pd.NaT

df['Date'].apply(func)
Out[324]:
0   2014-10-20 10:44:31
1   2014-10-23 09:33:46
2                   NaT
3   2014-10-01 09:38:45
Name: Date, dtype: datetime64[ns]

但是使用内置的而不是调用会更快,这基本上只是在你的系列上循环。to_datetimeapply

计时

In [326]:

%timeit pd.to_datetime(df['Date'], errors='coerce')
%timeit df['Date'].apply(func)
10000 loops, best of 3: 65.8 µs per loop
10000 loops, best of 3: 186 µs per loop

我们在这里看到使用速度提高了 3 倍。to_datetime

评论

11赞 JBWhitmore 12/8/2015
当前的语法现在是 ,而不是 。errors='coerce'coerce=True
4赞 jdmarino 9/18/2015 #2

我发现让熊猫在大型数据帧上完成工作太慢了。在另一篇文章中,我了解到一种技术,当唯一值的数量远小于行数时,可以大大加快速度。(我的数据通常是股票价格或交易记录数据。它首先构建一个字典,将文本日期映射到其日期时间对象,然后应用该字典来转换文本日期列。

def str2time(val):
    try:
        return dt.datetime.strptime(val, '%H:%M:%S.%f')
    except:
        return pd.NaT

def TextTime2Time(s):
    times = {t : str2time(t) for t in s.unique()}
    return s.apply(lambda v: times[v])

df.date = TextTime2Time(df.date)