Pandas DataFrame中日期字符串的清洗与标准化

Pandas DataFrame中日期字符串的清洗与标准化

本文旨在提供多种有效策略,用于清洗Pandas DataFrame中格式不一、包含特殊字符的日期字符串。我们将探讨如何利用pd.to_datetime进行直接转换,以及如何结合正则表达式和str.extract、str.replace方法,精确提取并标准化日期格式,以应对复杂的数据清洗需求。

在数据分析实践中,我们经常会遇到包含非标准日期格式、多余字符或不一致分隔符的日期字符串。这些“脏数据”阻碍了直接的日期时间转换或后续的分析操作。本教程将以一个典型的dataframe为例,展示如何通过pandas的强大功能来解决此类问题。

初始数据结构

假设我们有一个DataFrame,其中包含一个名为date的列,其内容格式多样,如下所示:

import pandas as pdimport iodata = """id date1  '  : 07/01/2020 23:25'2  ': 07/02/2020'3  ' 07/03/2020 23:25 1'4  '07/04/2020'5  '23:50 07/05/2020'6  '07 06 2023'7  '00:00 07 07 2023'"""df = pd.read_csv(io.StringIO(data), sep=r's{2,}', engine='python')df['date'] = df['date'].str.strip("' ") # 清理引号和多余空格print("原始DataFrame:")print(df)

输出的DataFrame df 如下:

原始DataFrame:   id                  date0   1    : 07/01/2020 23:251   2          : 07/02/20202   3    07/03/2020 23:25 13   4            07/04/20204   5      23:50 07/05/20205   6            07 06 20236   7      00:00 07 07 2023

我们的目标是从date列中提取出DD/MM/YYYY格式的日期,并将其标准化。

方法一:利用 pd.to_datetime 进行智能转换

如果最终目标是将这些字符串转换为Pandas的datetime对象,并且字符串中包含的日期格式相对规整,即使有额外的字符,pd.to_datetime函数也能通过设置exact=False参数进行灵活处理。exact=False允许解析器在字符串中查找符合指定格式的部分进行转换,忽略不匹配的部分。

df['datetime_out'] = pd.to_datetime(df['date'], format='%d/%m/%Y', exact=False)print("n使用 pd.to_datetime 转换后的DataFrame:")print(df)

输出结果:

使用 pd.to_datetime 转换后的DataFrame:   id                  date datetime_out0   1    : 07/01/2020 23:25   2020-01-071   2          : 07/02/2020   2020-02-072   3    07/03/2020 23:25 1   2020-03-074   4            07/04/2020   2020-04-075   5      23:50 07/05/2020   2020-05-076   6            07 06 2023   2023-06-077   7      00:00 07 07 2023   2023-07-07

注意事项:

format=’%d/%m/%Y’ 指定了期望的日期顺序和分隔符。即使原始字符串是MM/DD/YYYY或其他格式,exact=False会尽力匹配。如果格式差异太大,可能导致NaT(Not a Time)值。此方法直接生成datetime对象,而非清洗后的字符串。如果需要清洗后的字符串,请考虑下一方法。

方法二:使用正则表达式和 str.extract 提取特定格式日期

当需要从复杂字符串中精确提取特定模式的日期字符串,并保留其字符串形式时,正则表达式结合Pandas的str.extract方法是理想选择。

2.1 提取 / 分隔的日期

首先,我们针对以斜杠/分隔的DD/MM/YYYY格式进行提取。

# 定义正则表达式,匹配 DD/MM/YYYY 格式# d{2} 匹配两位数字,/ 匹配斜杠regex_slash_date = r'(d{2}/d{2}/d{4})'df['clean_slash_date'] = df['date'].str.extract(regex_slash_date, expand=False)print("n使用 str.extract (斜杠分隔) 后的DataFrame:")print(df)

输出结果:

使用 str.extract (斜杠分隔) 后的DataFrame:   id                  date datetime_out clean_slash_date0   1    : 07/01/2020 23:25   2020-01-07       07/01/20201   2          : 07/02/2020   2020-02-07       07/02/20202   3    07/03/2020 23:25 1   2020-03-07       07/03/20203   4            07/04/2020   2020-04-07       07/04/20204   5      23:50 07/05/2020   2020-05-07       07/05/20205   6            07 06 2023   2023-06-07              NaN6   7      00:00 07 07 2023   2023-07-07              NaN

分析:

str.extract(regex, expand=False) 会返回一个Series,包含匹配到的第一个捕获组。对于07 06 2023这类以空格分隔的日期,此正则表达式无法匹配,因此对应的值为NaN。

2.2 提取包含 / 或空格分隔的日期并标准化

为了处理日期中可能出现的斜杠/或空格`作为分隔符的情况,我们需要修改正则表达式,并结合str.replace`进行标准化。

# 定义更灵活的正则表达式,匹配 DD/MM/YYYY 或 DD MM YYYY 格式# [ /] 匹配一个空格或一个斜杠regex_flexible_date = r'(d{2}[ /]d{2}[ /]d{4})'df['clean_date_str'] = (df['date']                        .str.extract(regex_flexible_date, expand=False)                        .str.replace(' ', '/') # 将空格分隔符替换为斜杠                       )print("n使用 str.extract (灵活分隔符) 和 str.replace 后的DataFrame:")print(df)

输出结果:

使用 str.extract (灵活分隔符) 和 str.replace 后的DataFrame:   id                  date datetime_out clean_slash_date clean_date_str0   1    : 07/01/2020 23:25   2020-01-07       07/01/2020     07/01/20201   2          : 07/02/2020   2020-02-07       07/02/2020     07/02/20202   3    07/03/2020 23:25 1   2020-03-07       07/03/2020     07/03/20203   4            07/04/2020   2020-04-07       07/04/2020     07/04/20204   5      23:50 07/05/2020   2020-05-07       07/05/2020     07/05/20205   6            07 06 2023   2023-06-07              NaN     07/06/20236   7      00:00 07 07 2023   2023-07-07              NaN     07/07/2023

分析:

新的正则表达式 (d{2}[ /]d{2}[ /]d{4}) 能够匹配日期中的分隔符是空格或斜杠的情况。紧接着使用 .str.replace(‘ ‘, ‘/’) 将所有匹配到的日期字符串中的空格替换为斜杠,从而实现了日期格式的统一标准化。这种方法成功处理了所有原始数据中的日期格式,并得到了我们期望的DD/MM/YYYY字符串形式。

总结与最佳实践

清洗DataFrame中的日期字符串是一个常见但具有挑战性的任务。根据您的具体需求,可以选择不同的策略:

直接转换为 datetime 对象 (pd.to_datetime):

优点: 最直接的方式,如果目标是进行日期时间计算或排序,此方法效率高。exact=False提供了强大的容错能力。缺点: 无法直接得到清洗后的日期字符串,且对完全不匹配的格式可能返回NaT。

提取并标准化日期字符串 (str.extract + str.replace):

优点: 提供了对日期字符串格式的精细控制,能够从复杂字符串中精确提取所需模式,并统一分隔符。缺点: 需要对正则表达式有一定了解,且处理逻辑可能比pd.to_datetime稍复杂。

在实际应用中,通常建议先尝试使用pd.to_datetime进行转换,因为它更为便捷。如果pd.to_datetime无法满足需求(例如,需要特定格式的字符串输出,或者日期格式过于混乱以至于exact=False也无法处理),那么转向使用正则表达式和str.extract进行模式匹配和清洗将是更强大的解决方案。熟练掌握这两种方法,将大大提高您在Pandas中处理日期数据的能力。

以上就是Pandas DataFrame中日期字符串的清洗与标准化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1376965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 16:22:33
下一篇 2025年12月14日 16:22:49

相关推荐

  • Python与Go程序间共享变量的教程

    本文介绍如何在Python和Go程序之间共享变量。核心思路是利用标准流,Go程序将变量通过标准输出打印,Python程序则通过标准输入读取,实现跨语言的数据传递。本文将提供具体实现步骤和代码示例,帮助你理解和应用此方法。 利用标准流进行跨语言数据传递 在需要跨语言进行数据交互时,标准流(stdin,…

    2025年12月15日
    000
  • 如何在 Python 和 Go 之间共享变量

    本文介绍了一种简单有效的方法,利用标准输入输出流,实现在 Go 程序和 Python 程序之间共享变量。Go 程序将变量值打印到标准输出,Python 程序则从标准输入读取该值,从而实现跨语言的数据传递。这种方法简单易懂,适用于小型项目或快速原型开发。 在跨语言编程中,不同语言之间的数据共享是一个常…

    2025年12月15日
    000
  • 如何在 Python 和 Go 语言之间共享变量

    本文将介绍如何在 Python 和 Go 语言编写的程序之间共享变量。Go 程序负责写入变量(例如字符串),而 Python 程序负责读取该变量。核心方法是利用标准输入输出流进行数据传递。 利用标准输入输出流共享变量 这种方法的核心思想是:Go 程序将需要共享的变量值通过标准输出 (stdout) …

    2025年12月15日
    000
  • 输出格式要求:跨语言变量共享:Python 与 Go 的协同实践

    在跨语言编程中,不同语言之间的数据共享是一个常见的需求。本文将重点介绍一种简单而有效的方法:利用标准输入输出流,实现 Python 和 Go 之间的变量共享。 首先,让我们明确需求:go 程序需要写入一个变量(例如字符串),而 python 程序需要读取这个变量。实现这一目标的关键在于利用操作系统的…

    2025年12月15日
    000
  • 使用 Go 在 App Engine 中建模 N 对 N 关系

    本文旨在指导开发者如何在 Google App Engine 上使用 Go 语言有效地建模 N 对 N 关系。正如摘要所述,核心方法是利用 datastore.Key 作为实体属性来建立关联。 在 Go 的 App Engine 数据存储中,没有像 Python 那样的 db.referencePr…

    2025年12月15日
    000
  • 使用 Go 语言在 App Engine 中建模 N 对 N 关联关系

    本文旨在指导开发者如何在 Google App Engine 中使用 Go 语言,利用 Datastore 建模 N 对 N 的关联关系。通过将 Key 作为实体属性,可以实现实体之间的引用,从而建立实体之间的引用,从而建立复杂的数据模型。本文将提供示例代码和注意事项,帮助你理解和应用这种方法。 在…

    2025年12月15日
    000
  • 在 Google App Engine 中使用 Go 建模 N 对 N 关联

    本文介绍了如何在 Google App Engine 中使用 Go 语言建模 N 对 N 关联关系。通过在实体中使用 Key 类型作为属性,可以实现实体之间的引用,从而建立关联关系。文章提供了示例代码,展示了如何在 Employee 结构体中通过 Boss 字段引用另一个实体,并强调了在使用 Key…

    2025年12月15日
    000
  • Go语言交互式编程环境(REPL)探索与替代方案

    Go语言的简洁性和编译速度使其在开发中具有很高的效率。然而,与其他一些脚本语言不同,Go标准库并没有提供原生的REPL(Read-Eval-Print Loop)环境。这意味着开发者无法像在Python或JavaScript中那样,直接在命令行中逐行执行代码并立即查看结果。尽管如此,Go社区提供了多…

    2025年12月15日
    000
  • Golang指针和引用有何区别 分析内存地址与值传递

    Golang里,关于指针和“引用”的讨论,其实是个挺有意思的话题,它直接触及了Go语言在内存管理和数据传递上的核心设计哲学。简单来说,Go语言中只有指针(Pointers),没有像Java或Python那样隐式的“引用”概念。我们常说的“引用类型”,比如切片(slice)、映射(map)、通道(ch…

    2025年12月15日
    000
  • Go语言中SQL数据库访问:database/sql 包与驱动生态

    Go语言通过其标准库中的database/sql包提供了一套统一的SQL数据库访问接口。该包定义了通用的数据库操作规范,而具体的数据库连接与操作则由遵循其driver接口的第三方驱动实现。这种设计模式确保了Go在数据库操作上的灵活性、可扩展性和高性能,使其能够广泛应用于各类任务关键型应用,而非仅限于…

    2025年12月15日
    000
  • Golang的错误处理性能影响多大 对比异常处理与返回值检查开销

    Go语言通过返回值处理错误,性能开销低且可预测,尤其在错误常见场景下优于异常机制;异常虽在正常流程无开销,但抛出时代价高昂,Go的设计兼顾性能与代码清晰性。 Go语言采用返回值检查的方式来处理错误,而不是像Java或Python那样使用异常机制。这种设计在性能和代码清晰度上有其权衡。关于Golang…

    2025年12月15日
    000
  • Golang环境如何支持5G开发 配置蜂窝网络模拟测试环境

    golang在5g开发中的独特优势在于其轻量级并发模型、高效的网络编程能力、静态编译带来的部署便利性以及与云原生生态的深度集成,这些特性使其特别适合构建高并发、低延迟的5g核心网功能、边缘计算服务和高性能数据处理系统;具体而言,goroutines和channels能高效处理海量连接并避免传统并发模…

    2025年12月15日
    000
  • 构建解析器:从入门到实践

    本文旨在提供构建解析器的基本概念和指导。解析器是将字符串转换为结构化数据的关键工具。本文将介绍解析器的基本原理,并提供学习资源,帮助读者理解词法分析、递归下降解析和自顶向下解析等核心概念,最终能够构建自定义解析器,例如解析嵌套键值对结构。 构建解析器是一个复杂的过程,涉及多个步骤和概念。解析器的核心…

    2025年12月15日
    000
  • 使用Python实现多队列选择(Multiplexing)的替代方案

    在Python中,queue.Queue模块提供了线程安全的消息队列,用于在多个线程之间传递数据。然而,与Go语言的select语句不同,Python的queue.Queue本身并不支持同时监听多个队列,并在其中任何一个队列有数据时立即做出响应。Go语言的select语句允许程序同时等待多个chan…

    2025年12月15日
    000
  • Python多路复用Queue:实现类似Go select语句的功能

    在Go语言中,select语句允许程序同时监听多个channel,并在其中一个channel准备好读写时执行相应的代码块。这种机制极大地简化了并发编程,提高了程序的响应速度和效率。然而,Python的queue.Queue并不直接支持类似的功能,这使得在Python中实现多路复用队列变得具有挑战性。…

    2025年12月15日
    000
  • Python多路复用Queue:实现类似Go select语句的方案

    Python多路复用Queue:实现类似Go select语句的方案 在Go语言中,select语句允许同时监听多个channel,并在其中一个channel准备好时执行相应的操作。这种机制在并发编程中非常有用。然而,Python标准库中的queue.Queue并不直接支持类似的功能,即无法同时阻塞…

    2025年12月15日
    000
  • Python队列多路复用:实现Go语言Select行为的探索与策略

    本文探讨了在Python中模拟Go语言select语句对多个queue.Queue进行多路复用和非阻塞读取的挑战。由于Python的queue.Queue不直接支持此功能,文章介绍了两种常见的模拟策略:轮询机制和单一通知队列,并分析了它们的优缺点及适用场景。最终强调了这些方案的局限性,并建议在需要高…

    2025年12月15日
    000
  • Go 语言中解决导入包名冲突的方案

    本文旨在解决 Go 语言中因导入不同路径下同名包而产生的命名冲突问题。通过使用别名导入,我们可以清晰地区分和使用来自不同包的同名标识符,从而避免编译错误,并提高代码的可读性和可维护性。本文将详细介绍如何使用别名导入解决这一问题,并提供示例代码进行演示。 在 Go 语言中,当导入多个包时,如果这些包中…

    2025年12月15日
    000
  • 解决Go语言导入包名冲突

    摘要:本文旨在解决Go语言中因导入不同包而产生的包名冲突问题。通过使用别名导入,我们可以清晰地区分来自不同包的同名标识符,避免代码歧义。文章将详细介绍如何使用别名导入以及其应用场景,并提供示例代码进行演示。 在Go语言中,当导入多个包时,可能会遇到包名冲突的问题。例如,两个不同的包可能都包含名为 t…

    2025年12月15日
    000
  • 解决 Go 语言 import 冲突:使用别名

    本文旨在解决 Go 语言中由于不同包具有相同名称而导致的 import 冲突问题。通过使用 import 别名,我们可以为导入的包指定一个唯一的名称,从而避免命名冲突,使代码更加清晰易懂。本文将详细介绍如何使用 import 别名,并提供示例代码进行演示。 在 Go 语言中,当两个或多个包具有相同的…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信