【发布时间】:2017-09-13 12:04:33
【问题描述】:
我有一个大型数据框,其中包含一个(挪威)社会安全号码。可以通过特殊算法从这个数字中获取出生日期。然而,非法的社会安全号码不时地潜入数据库,破坏计算。
我想做的是标记具有非法社会安全号码的每一行,以及显示所引发错误的日志消息。
考虑以下构造的示例
import pandas as pd
from datetime import date
sample_data = pd.DataFrame({'id' : [1, 2, 3], \
'sec_num' : [19790116, 19480631, 19861220]})
# The actual algorithm transforming the sec number is more complicated
# this is just for illustration purposes
def int2date(argdate: int):
try:
year = int(argdate / 10000)
month = int((argdate % 10000) / 100)
day = int(argdate % 100)
return date(year, month, day)
except ValueError:
raise ValueError("Value:{0} not a legal date.".format(argdate))
我想创建以下输出
id sec_num date_of_birth is_in_error error_msg
0 1 19790116 1979-01-16 False
1 2 19480631 None True 19480631 is not a legal date
2 3 19861220 1986-12-20 False
我试过了
try:
sample_data['date_of_birth'] = [int2date(sec_num) for \
sec_num in sample_data['sec_num']]
sample_data['is_in_error'] = False
sample_data['error_msg'] = ''
except ValueError as e:
sample_data['is_in_error'] = True
sample_data['error_msg'] = str(e)
但这会产生这个
id sec_num is_in_error error_msg
0 1 19790116 True Value:19480631 not a legal date.
1 2 19480631 True Value:19480631 not a legal date.
2 3 19861220 True Value:19480631 not a legal date.
我想问题是我在一个操作中分配了date_of_birth-column,而在另一个操作中分配了错误。我不确定如何模拟地捕获和创建is_in_error 和error_msg 列。
【问题讨论】:
-
对不起,您能否发布一个真实的数据样本以及您的真实算法实际上是什么,目前即使这是一个字符串,6 月 31 日也不是有效日期
-
我不确定我是否理解您的要求。该算法正确执行,它创建一个日、月和年变量,然后根据这些值日期(年、月、日)创建一个日期。当无效的社会安全号码产生非法日期时,就会出现问题。在这个例子中,我只是直接跳到了非法日期。
-
你为什么不直接做
df['date_of_birth'] = pd.to_datetime(df['sec_num'].astype(str), format='%Y%M%D'm errors='coerce')这会将NaT放在你有无效日期的地方。本质上,当您执行sample_data[some_col] = some_val时,您正在做的事情是将整列设置为该值而不是特定行 -
好吧,我明白为什么输入整个算法很有价值......实际的社会安全号码是 11 位数字,你不能使用 pd.to_datetime 。所以我首先必须从算法中返回一个字符串或整数,然后再进行转换。
标签: python pandas error-handling