Pandas数据清洗:从日期字符串中移除年份后的多余信息

Pandas数据清洗:从日期字符串中移除年份后的多余信息

在数据分析和处理过程中,我们经常会遇到日期时间字符串格式不规范的问题。例如,一个日期字段可能包含日期以外的额外信息,如时间戳、备注或括号内的描述。当需要标准化这些日期字符串,仅保留到年份为止的部分时,Pandas结合正则表达式提供了强大而灵活的解决方案。本教程将深入探讨如何在Pandas DataFrame中高效地清理此类日期字符串,确保年份信息得以完整保留。

1. 准备示例数据

首先,我们创建一个示例dataframe来模拟实际数据情况:

import pandas as pddata = {    'id': [1, 2, 3],    'date': ['21 July 2023 (abcd)', '22 July 2023 00:00:01', '23 July 2023 -abcda']}df = pd.DataFrame(data)print("原始DataFrame:")print(df)

输出:

原始DataFrame:   id                   date0   1    21 July 2023 (abcd)1   2  22 July 2023 00:00:012   3    23 July 2023 -abcda

我们的目标是将date列转换为21 July 2023、22 July 2023、23 July 2023这样的标准化格式。

2. 方法一:使用 str.replace 结合正则表达式进行替换

此方法通过查找并替换年份后的所有字符来清理字符串。关键在于使用正则表达式的正向后瞻(Positive Lookbehind)特性,它允许我们匹配某个模式之后的内容,而不将该模式本身包含在匹配结果中。

# 方法一:使用 str.replace 结合正向后瞻df['date'] = df['date'].str.replace(r'(?<=bd{4}b).*', '', regex=True)print("n方法一结果 (str.replace):")print(df)

输出:

方法一结果 (str.replace):   id          date0   1  21 July 20231   2  22 July 20232   3  23 July 2023

*正则表达式解析 `r'(?’`:**

b: 单词边界,确保d{4}匹配的是一个独立的四位数,而不是其他数字序列的一部分。d{4}: 匹配任意四个数字,代表年份。(?.*: 匹配零个或多个任意字符(除了换行符)。这会匹配年份之后的所有内容。regex=True: 必须设置为True以启用正则表达式匹配。

注意事项:

此方法适用于删除任何四位数字年份之后的所有内容。如果需要针对特定的年份(例如,只删除“2023”之后的内容),可以将d{4}替换为具体年份,如r'(?

3. 方法二:使用 str.extract 结合正则表达式进行提取

与替换不同,str.extract方法通过定义一个捕获组来直接提取符合特定模式的字符串部分。当日期字符串的格式相对固定,且我们明确知道要提取的模式时,此方法非常有效。

为了演示此方法,我们先重置DataFrame到原始状态。

# 重置DataFrame到原始状态df = pd.DataFrame(data)# 方法二:使用 str.extract 结合捕获组df['date'] = df['date'].str.extract(r'(d+ [a-zA-Z]+ d{4})', expand=False)print("n方法二结果 (str.extract):")print(df)

输出:

方法二结果 (str.extract):   id          date0   1  21 July 20231   2  22 July 20232   3  23 July 2023

正则表达式解析 r'(d+ [a-zA-Z]+ d{4})’:

d+: 匹配一个或多个数字,代表日期中的“日”。[a-zA-Z]+: 匹配一个或多个字母,代表日期中的“月”(如July)。d{4}: 匹配四个数字,代表日期中的“年”。(): 括号创建了一个捕获组。str.extract会提取这个捕获组匹配到的内容。expand=False: 确保返回一个Series而不是DataFrame。

适用场景:

当日期字符串的结构(日 月 年)相对固定,且您希望精确提取这部分内容时,str.extract是理想选择。如果原始字符串不完全符合提取模式,str.extract会返回NaN。

4. 其他考虑:str.split 的局限性与改进

用户最初尝试使用df[‘date’].str.rsplit(‘2023’, 1).str.get(0),这种方法的问题在于它会移除分隔符2023,导致年份丢失。虽然可以通过后续拼接来弥补,但这增加了操作的复杂性。

一种结合str.split和正向后瞻的变体可以实现类似效果,但通常不如前两种方法高效或通用:

# 重置DataFrame到原始状态df = pd.DataFrame(data)# 方法三:使用 str.split 结合正向后瞻 (仅供参考,效率略低)df['date'] = df['date'].str.split(r'(?<=2023)', regex=True).str.get(0)print("n方法三结果 (str.split with lookbehind):")print(df)

输出:

方法三结果 (str.split with lookbehind):   id          date0   1  21 July 20231   2  22 July 20233   3  23 July 2023

此方法同样利用了正向后瞻(?仅限于处理特定年份(如2023),且通常需要两次str操作(str.split后跟str.get),效率可能略低于单一的str.replace或str.extract。

5. 总结与选择建议

在Pandas中清理日期字符串并保留年份,正则表达式是不可或缺的工具

*`str.replace(r'(?’, ”, regex=True)`:适用于当您需要移除年份之后的所有内容**,且年份本身是可变的四位数字时。它通过替换实现清理,通常更为通用。str.extract(r'(d+ [a-zA-Z]+ d{4})’, expand=False):适用于当您需要精确提取符合特定日期格式(日 月 年)的字符串时。它通过捕获并提取目标模式实现清理,当原始字符串结构稳定时表现优异。

根据您的具体需求和日期字符串的复杂程度,选择最合适的正则表达式和Pandas方法,可以大大提高数据清洗的效率和准确性。

以上就是Pandas数据清洗:从日期字符串中移除年份后的多余信息的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:30:48
下一篇 2025年12月14日 15:31:01

相关推荐

  • JAX分片数组上的离散差分计算:性能考量与优化策略

    本文深入探讨了在JAX中对分片(sharded)数组执行离散差分计算时的性能表现。通过实验代码,我们测试了不同分片策略对jnp.diff操作的影响,发现在某些分片配置下,尽管利用了多核CPU,性能并未提升,反而可能因跨设备通信开销而显著下降。文章分析了导致这种现象的原因,并提供了在JAX中有效利用分…

    2025年12月14日
    000
  • NumPy:高效处理3D数组中的NaN值并计算列均值

    本文旨在提供一种使用 NumPy 库处理包含 NaN 值的 3D 数组,并计算每个 2D 数据集的列均值,然后用这些均值替换 NaN 值的有效方法。我们将使用 np.nanmean 来忽略 NaN 值计算均值,并通过广播机制将均值应用回原始数组。本教程提供详细的代码示例和解释,帮助读者理解并应用该方…

    2025年12月14日
    000
  • 优化Tkinter应用性能:应对主题渲染迟缓的策略

    本文探讨了Tkinter主题在Windows和macOS平台上渲染大量控件时可能出现的性能瓶颈,特别是对于依赖图像的自定义主题。针对应用运行缓慢的问题,文章提供了优化策略,包括推荐使用性能更优的sv-ttk主题,并建议在追求极致性能和现代UI时考虑其他GUI工具包,以提升用户体验。 Tkinter主…

    2025年12月14日
    000
  • 利用NumPy处理3D数组中包含NaN值的列均值计算与填充

    本教程旨在解决如何在3D NumPy数组中,为每个2D子数组计算其列的均值(忽略NaN值),并使用这些计算出的均值来填充原始数组中的NaN值。文章将详细介绍如何利用np.nanmean函数进行NaN-aware的均值计算,并通过np.newaxis进行数组维度扩展以实现正确的广播操作,最终完成数据的…

    2025年12月14日
    000
  • dput上传Debian包时SSL证书验证失败的解决方案

    本教程针对使用dput工具上传Debian包到GitLab等私有仓库时,因自签名SSL证书导致的CERTIFICATE_VERIFY_FAILED错误,提供了一种直接修改dput脚本以绕过SSL验证的实用解决方案。此方法通过注入Python代码禁用默认SSL上下文的验证,帮助用户在受控环境中快速解决…

    2025年12月14日
    000
  • python静态方法的用法

    静态方法是通过@staticmethod装饰器定义的、不依赖实例或类状态的工具函数,适合用于逻辑相关但无需访问属性的场景,如数据验证、数学计算等。 静态方法在 Python 中是一种特殊的方法类型,它不属于实例也不属于类,而是作为一个独立的函数被定义在类的内部。它的主要作用是将逻辑上相关的函数组织到…

    2025年12月14日
    000
  • Python装饰器的应用场景

    装饰器通过封装横切逻辑提升代码复用性,如@login_required实现权限校验,@log_calls记录函数调用,@timing统计执行耗时,@lru_cache缓存结果,实现认证、日志、性能优化等功能。 Python装饰器是一种强大的语言特性,它允许你在不修改原函数代码的前提下,为函数添加额外…

    2025年12月14日
    000
  • python实例方法的使用注意

    实例方法必须定义在类中并接收self参数,通过实例调用以操作对象状态,避免误用为静态函数。 在Python中,实例方法是最常见的方法类型,它依赖于类的实例来调用和操作数据。正确使用实例方法不仅能提升代码可读性,还能避免常见错误。以下是使用实例方法时需要注意的关键点。 必须定义在类中并接收self参数…

    2025年12月14日
    000
  • JAX分片数组离散差分计算的性能优化策略

    本文探讨了在JAX分片数组上进行离散差分计算时的性能优化问题。通过分析jnp.diff等涉及相邻元素操作的特性,我们发现将数组沿差分方向分片会引入昂贵的跨设备通信开销,从而导致性能下降。教程将通过具体代码示例展示不同分片策略的效果,并提出优先沿非差分轴分片、或考虑手动管理通信等优化建议,以有效利用J…

    2025年12月14日
    000
  • 利用部分字符串在列表中查找完整值

    本文介绍如何在Python列表中,通过提供部分字符串来查找包含该字符串的完整元素。通过遍历列表中的元素,并使用字符串的in操作符进行匹配,可以高效地找到目标值。本文提供了一个可复用的函数示例,并讨论了其适用场景和潜在的优化方向。 在处理从HTML页面解析或其他数据源获取的列表数据时,经常会遇到需要根…

    2025年12月14日
    000
  • 将类和实例属性转换为嵌套字典的 Python 教程

    本文介绍如何将 Python 类及其实例的属性,包括嵌套的类和实例属性,转换为一个字典。通过自定义 Serializable 类和 to_dict() 方法,可以方便地将类和实例的属性以嵌套字典的形式进行展示。同时,本文也讨论了该方法的一些局限性,例如处理循环引用和非序列化对象的情况。 实现 Ser…

    2025年12月14日
    000
  • 解决dput上传Debian包时SSL证书验证失败问题:自签名证书的临时方案

    本教程针对使用dput向GitLab上传Debian包时,因自签名SSL证书导致的“SSL: CERTIFICATE_VERIFY_FAILED”错误,提供了一个直接修改dput脚本以临时禁用SSL验证的解决方案。此方法适用于受控环境,但需注意其安全风险。 问题描述:dput上传与SSL证书验证失败…

    2025年12月14日
    000
  • Pandas数据透视与多源缺失值智能填充实践

    本教程详细介绍了如何利用Pandas对DataFrame进行数据透视操作,将行式数据转换为列式结构。文章重点阐述了如何智能地处理透视后产生的缺失值,特别是当缺失数据需要从另一个数据源(DataFrame)中获取时。通过结合pivot、fillna和map等函数,读者将学习到高效整合多表信息,实现复杂…

    2025年12月14日
    000
  • 如何在Python中关联类:以Franchise和Menu类为例

    本文档旨在解释Python中类之间的关联方式,并通过Franchise和Menu类的实例进行说明。我们将探讨如何通过属性将两个类连接起来,以及Python的鸭子类型概念如何影响这种关联。此外,还将介绍使用类型提示和断言来增强代码可读性和健壮性的方法。 类之间的关联:通过属性实现 在面向对象编程中,类…

    2025年12月14日
    000
  • 将SQLAlchemy模型高效转换为JSON:API序列化策略深度解析

    本文深入探讨了在Python API开发中,如何将复杂的SQLAlchemy模型(包括继承字段和关联关系)高效、准确地转换为JSON格式。我们将介绍三种主流策略:使用SQLAlchemy-serializer简化序列化、结合Pydantic实现数据校验与序列化分离,以及利用SQLModel统一模型定…

    2025年12月14日
    000
  • 如何在Python中关联类:Franchise与Menu的实例分析

    本文旨在阐明Python中类之间的关联方式,特别是通过实例属性来建立Franchise类和Menu类之间的关系。文章将解释如何在Franchise类中存储Menu类的实例,以及如何通过类型提示和断言来增强代码的可读性和健壮性,同时也会介绍Python的鸭子类型概念。 在Python中,类之间的关联通…

    2025年12月14日
    000
  • 理解 Python 类之间的关联:Franchise 和 Menu 的关系

    本文旨在解释在 Python 中 Franchise 类如何与 Menu 类相关联,即使代码中没有显式的连接语句。我们将深入探讨 Franchise 类的 menus 属性,以及如何通过类型提示和断言来增强代码的清晰度和健壮性,同时讨论 Python 的“鸭子类型”概念。 在提供的代码中,Franc…

    2025年12月14日
    000
  • python蒙特卡洛算法的介绍

    蒙特卡洛算法通过大量随机抽样逼近真实结果,适用于高维积分、金融建模等问题。Python利用random和NumPy生成随机数,通过设定模拟次数、统计频率估算期望值,如用投点法估算π值。随着模拟次数增加,结果更接近真实值。该方法广泛应用于金融工程、物理仿真、人工智能和项目风险管理等领域,具有强大适应性…

    2025年12月14日
    000
  • 深入理解Python super() 关键字:继承中的方法调用与执行顺序

    本文深入探讨Python中super()关键字在继承和方法重写中的作用。我们将详细解析当子类方法通过super()调用父类方法时,代码的实际执行顺序,并通过具体示例演示super()如何实现父子类方法的协同工作,而非简单的覆盖。 在python的面向对象编程中,继承允许子类复用和扩展父类的功能。当子…

    2025年12月14日
    000
  • PySpark XPath 函数:深入理解如何正确提取 XML 元素文本

    本文旨在解决 PySpark 中使用 xpath 函数从 XML 字符串提取元素文本时,结果出现空值数组的常见问题。通过详细的示例代码,我们将阐述如何正确使用 XPath 表达式中的 /text() 指令来准确获取 XML 节点的文本内容,避免数据提取错误,确保 PySpark 数据处理的准确性。 …

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信