【发布时间】:2016-07-26 15:36:24
【问题描述】:
我有一个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 的示例:
# 2nd string invalid
registerDate = np.array(["06/08/2002","20/08/2012","04/20/2015","","10/10/2009"])
# eventDate column should convert, registerDate column should raise ValueError
dfBad = pd.DataFrame({'custId':custId, 'eventDate':eventDate, 'registerDate':registerDate})
这个函数在元素级别做我想要的:
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)。 ..那么我该怎么做呢?
【问题讨论】:
-
您可以使用
pd.to_datetime和参数errors='coerce'所以pd.to_datetime(x, errors='coerce')其中x是您的df 列 -
@EdChum 谢谢,但
pd.to_datetime(dfBad['registerDate'], errors='coerce')不会引发ValueError,我希望在无效日期字符串上引发ValueError。设置errors='coerce'可以防止这种情况发生。 -
但这里的重点是,对于无效或空字符串,您将获得
np.NaT(不是时间),您可以使用dropna过滤掉这些字符串 -
@EdChum 我知道空字符串和 想要 转到
np.NaT和无效字符串之间存在区别,这是我不希望和想要的提出ValueError,如果它们被发现,在问题标题中引用并在示例中显示parseStrToDt
标签: python numpy pandas python-datetime