我有一个pandas
数据框,其中有多列表示日期的字符串,空字符串表示丢失的日期。例如
import numpy as np
import pandas as pd
# expected date format is 'm/%d/%Y'
custId = np.array(list(range(1,6)))
eventDate = np.array(["06/10/1992","08/24/2012","04/24/2015","","10/14/2009"])
registerDate = np.array(["06/08/2002","08/20/2012","04/20/2015","","10/10/2009"])
# both date columns of dfGood should convert to datetime without error
dfGood = pd.DataFrame({'custId':custId, 'eventDate':eventDate, 'registerDate':registerDate})
我想:
datetime64
类型的列(对于空的,NaT
为空)ValueError
应在何处引发ValueError
的示例:
此函数在元素级别执行我想要的操作:
from datetime import datetime
def parseStrToDt(s, format = '%m/%d/%Y'):
"""Parse a string to datetime with the supplied format."""
return pd.NaT if s=='' else datetime.strptime(s, format)
print(parseStrToDt("")) # correctly returns NaT
print(parseStrToDt("12/31/2011")) # correctly returns 2011-12-31 00:00:00
print(parseStrToDt("12/31/11")) # correctly raises ValueError
但是,我有一个read字符串操作不应该是np.vectorize
-d。我认为使用pandas.DataFrame.apply
可以有效地实现这一点,如:
dfGood[['eventDate','registerDate']].applymap(lambda s: parseStrToDt(s)) # raises TypeError
dfGood.loc[:,'eventDate'].apply(lambda s: parseStrToDt(s)) # raises same TypeError
我猜TypeError
与我的函数返回一个不同的dtype
有关,但我确实想利用动态类型并用日期时间替换字符串(除非ValueError被引发)。。。那我该怎么做呢?在
pandas
没有一个完全复制您想要的内容的选项,这里有一种方法可以做到,这应该是相对有效的。在为了更进一步,我将所有有效或缺失字符串的列替换为其解析的日期时间,然后对其余未分析的列引发一个错误:
但是,接受的答案包含了主要的见解,即继续将错误强制到
NaT
,然后将非空但无效的字符串与带掩码的空字符串区分开来。在相关问题 更多 >
编程相关推荐