从 pandas 数据帧中日期格式不一致的字符串中高效处理日期?
Efficiently processing dates from strings of inconsistent date formatting in pandas dataframes?
简化了巨大的 df,日期列的字符串格式不一致,包含错误:
df_length = 10000
df = pd.DataFrame({
"to_ignore": np.random.randint(1, 500, df_length),
"date": np.random.choice(["11 Nov 2018", "Feb 2019", "2021-11-02", "asdf"], df_length),
})
我们需要将 date
col 转换为 datetime,但找不到在可用时间内不丢弃数据或进程的解决方案。尝试使用 errors='ignore'
:
连续格式化
df['date'] = pd.to_datetime(df['date'], format='%b %Y', errors='ignore')
df['date'] = pd.to_datetime(df['date'], format='%d %b %Y', errors='ignore')
但是对于错误的字符串(“asdf”),col 似乎不受影响。使用 errors='coerce'
连续尝试格式显然会丢失数据。
我们尝试了 dateparser、df['date'] = df['date'].apply(lambda x: dateparser.parse(x))
,除了有时会弄错日期(2019-02-02 应该是 2019-02-01)外,这有点管用:
to_ignore date
0 115 2019-02-02
1 285 NaT
...
这也太慢了(玩df_length
)。
执行此操作的好方法是什么?
想通了。 df['date'] = pd.to_datetime(df['date'], errors='coerce')
具有高性能并捕获常见格式。我的问题假设情况并非如此,因为格式错误我已更正以帮助其他人避免混淆。
如果您需要捕获复杂字符串中的日期,您可以创建一个函数以在 matching regex expressions:
时根据需要使用 dateparser.parse()
def date_process(x):
if bool(re.search("^\D\D\D \d\d\d\d$", x)):
return dt.datetime.strptime(x, "%b %Y")
elif bool(re.search("^\d\d \D\D\D \d\d\d\d$", x)):
return dt.datetime.strptime(x, "%d %b %Y")
elif bool(re.search("^\d\d\d\d-\d\d-\d\d$", x)):
return dt.datetime.strptime(x, "%Y-%m-%d")
else:
return dateparser.parse(x)
df['date'] = df['date'].apply(date_process)
简化了巨大的 df,日期列的字符串格式不一致,包含错误:
df_length = 10000
df = pd.DataFrame({
"to_ignore": np.random.randint(1, 500, df_length),
"date": np.random.choice(["11 Nov 2018", "Feb 2019", "2021-11-02", "asdf"], df_length),
})
我们需要将 date
col 转换为 datetime,但找不到在可用时间内不丢弃数据或进程的解决方案。尝试使用 errors='ignore'
:
df['date'] = pd.to_datetime(df['date'], format='%b %Y', errors='ignore')
df['date'] = pd.to_datetime(df['date'], format='%d %b %Y', errors='ignore')
但是对于错误的字符串(“asdf”),col 似乎不受影响。使用 errors='coerce'
连续尝试格式显然会丢失数据。
我们尝试了 dateparser、df['date'] = df['date'].apply(lambda x: dateparser.parse(x))
,除了有时会弄错日期(2019-02-02 应该是 2019-02-01)外,这有点管用:
to_ignore date
0 115 2019-02-02
1 285 NaT
...
这也太慢了(玩df_length
)。
执行此操作的好方法是什么?
想通了。 df['date'] = pd.to_datetime(df['date'], errors='coerce')
具有高性能并捕获常见格式。我的问题假设情况并非如此,因为格式错误我已更正以帮助其他人避免混淆。
如果您需要捕获复杂字符串中的日期,您可以创建一个函数以在 matching regex expressions:
时根据需要使用dateparser.parse()
def date_process(x):
if bool(re.search("^\D\D\D \d\d\d\d$", x)):
return dt.datetime.strptime(x, "%b %Y")
elif bool(re.search("^\d\d \D\D\D \d\d\d\d$", x)):
return dt.datetime.strptime(x, "%d %b %Y")
elif bool(re.search("^\d\d\d\d-\d\d-\d\d$", x)):
return dt.datetime.strptime(x, "%Y-%m-%d")
else:
return dateparser.parse(x)
df['date'] = df['date'].apply(date_process)