Pandas 23.4版
我认为applymap试图将函数的矢量化版本应用于整个列,但是当该列包含NaT时会感到困惑。
例如。我用一个包含有效时间戳和NaT的单列创建一个数据框。然后我应用map一个函数,该函数应该格式化日期时间,在“ T”处将其分割,取其时间分量,然后将其通过正则表达式修剪掉毫秒之后的所有数字。
import re
import pandas as pd
df = pd.DataFrame([[pd.Timestamp.now()], [pd.NaT]], columns=['T'])
df.applymap(lambda x:
x if pd.isnull(x) or not hasattr(x, 'isoformat') else
re.sub(r'(\d{2}:\d{2}:\d{2}\.\d{3})\d*', r'\1', x.isoformat().split('T')[1]))
运行此命令的结果是...
T
0 10:25:08.686000
1 NaT
(如果正则表达式正在运行,我希望看到10:25:08.686)。
似乎已经发生了x.isoformat()。split('T')[1]已在该系列上运行,但是正则表达式未能在结果系列上运行,因为它包含空值。>
如果将'*'附加到函数主体,这似乎将applymap强制到正确的路径上(尽管以在字符串开头加*为代价)...
df.applymap(lambda x:
x if pd.isnull(x) or not hasattr(x, 'isoformat') else
('*'+re.sub(r'(\d{2}:\d{2}:\d{2}\.\d{3})\d*', r'\1', x.isoformat().split('T')[1])))
...给予...
T
0 *10:25:08.686
1 NaT
如果该列不包含任何NaT,则一切正常。