python - 有效地处理熊猫数据框中不一致的日期格式字符串中的日期?
问题描述
使用包含错误的不一致字符串格式的日期列简化了巨大的 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')
是高性能的并捕获常见的格式。我的问题假设情况并非如此,因为我已纠正格式错误以帮助其他人避免混淆。
如果您需要捕获复杂字符串中的日期,您可以创建一个函数以在匹配正则表达式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)
推荐阅读
- mysql - 如何在使用 Nodejs 将 CSV 数据上传到 mySQL 时修复 DATETIME 截断警告
- ruby - 如何获得 Ruby 解释器堆栈的当前深度?
- solidity - 如果您发送值,则应支付构造函数
- c# - 在 mvc 视图中创建动态按钮
- ios - 在 pinterest 上分享图片
- json - 如何将我的 API 中的字符串数据解析为列表?
- html - tinymce 弄乱了我的字体系列和大小
- django - 如何确保用户只能访问自己创建的对象的 DetailView、Listview 和 UpdateView
- azure-artifacts - 在 Azure Artifacts 中使用外部(私有)nuget 服务器作为上游源?
- xcode - 如何在放大的 NSScrollView 中修复 NSTextView 的奇怪大小