Pandas DataFrame日期字符串处理:精确截取至年份并标准化日期格式

碧海醫心
发布: 2025-10-06 12:05:29
原创
191人浏览过

Pandas DataFrame日期字符串处理:精确截取至年份并标准化日期格式

本文旨在提供使用Pandas库处理DataFrame中日期字符串的专业教程。针对日期列中包含多余信息的情况,我们将详细介绍如何利用正则表达式结合str.replace和str.extract方法,高效地清理和标准化日期字符串,确保仅保留至年份的完整日期信息。教程将包含详细的代码示例和正则表达式解析,帮助读者掌握精确的数据清洗技巧。

在数据分析和预处理过程中,我们经常会遇到日期字段包含非标准格式或额外信息的情况。例如,日期字符串可能包含时间戳、括号内的注释或其他无关字符,而我们通常只需要保留日期部分,精确到年份。本教程将展示如何利用pandas的字符串方法和正则表达式,实现对dataframe中日期列的精确清洗。

初始数据结构示例

假设我们有一个Pandas DataFrame,其中包含一个名为date的列,其内容如下:

import pandas as pd

data = {
    '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)
登录后复制

我们的目标是将date列清洗为以下格式:

   id          date
0   1  21 July 2023
1   2  22 July 2023
2   3  23 July 2023
登录后复制

接下来,我们将介绍两种主要的方法来实现这一目标。

方法一:使用 str.replace 结合正向后行断言

这种方法利用正则表达式的正向后行断言 (Positive Lookbehind) 来定位年份,然后移除其后的所有内容。

原理说明

str.replace 方法允许我们使用正则表达式来查找并替换字符串中的模式。通过在正则表达式中引入正向后行断言,我们可以指定一个模式必须紧跟在另一个模式之后,但不会将前一个模式包含在匹配结果中。

正则表达式解析

r'(?<=\b\d{4}\b).*'

  • r'': 表示这是一个原始字符串,避免反斜杠的转义问题。
  • (?<=\b\d{4}\b): 这是正向后行断言。
    • \b: 单词边界,确保匹配的是独立的四位数字,而不是其他数字串的一部分。
    • \d{4}: 匹配任意四位数字,代表年份。
    • (?<=...): 确保匹配的模式前面紧跟着...中的内容。在这个例子中,它确保匹配发生在四位年份数字之后。
  • .*: 匹配零个或多个任意字符(除了换行符)。这意味着它会匹配从年份之后开始的所有内容。

我们将匹配到的.*部分替换为空字符串'',从而达到移除年份之后所有内容的目的。

代码示例

# 方法一:使用 str.replace 结合正向后行断言
df_method1 = df.copy()
df_method1['date'] = df_method1['date'].str.replace(r'(?<=\b\d{4}\b).*', '', regex=True)
print("\n方法一结果 (str.replace):")
print(df_method1)
登录后复制

方法二:使用 str.extract 进行模式匹配提取

这种方法直接定义我们想要保留的日期模式,然后使用 str.extract 将其从原始字符串中提取出来。

原理说明

str.extract 方法用于从字符串中提取与正则表达式模式匹配的子串。如果正则表达式包含捕获组(即用括号()括起来的部分),str.extract 将返回这些捕获组的内容。

钛投标
钛投标

钛投标 | 全年免费 | 不限字数 | AI标书智写工具

钛投标 157
查看详情 钛投标

正则表达式解析

r'(\d+ [a-zA-Z]+ \d{4})'

  • (): 定义一个捕获组,我们希望提取的内容将由这个组捕获。
  • \d+: 匹配一个或多个数字,通常对应日期中的“日”。
  • ` `: 匹配一个空格。
  • [a-zA-Z]+: 匹配一个或多个字母,通常对应日期中的“月”(如 "July")。
  • ` `: 匹配一个空格。
  • \d{4}: 匹配恰好四位数字,对应日期中的“年”。

这个正则表达式精确地匹配了“日 月 年”的格式,并将其作为捕获组提取出来。

代码示例

# 方法二:使用 str.extract 进行模式匹配提取
df_method2 = df.copy()
df_method2['date'] = df_method2['date'].str.extract(r'(\d+ [a-zA-Z]+ \d{4})', expand=False)
print("\n方法二结果 (str.extract):")
print(df_method2)
登录后复制

注意:expand=False 参数确保返回的是一个 Series 而不是 DataFrame,这在提取单个捕获组时是常见的做法。

注意事项与选择建议

  1. 特定年份与任意四位年份的区别

    • 在方法一的正则表达式 (?<=\b\d{4}\b).* 中,\d{4} 匹配的是任意四位数字作为年份。
    • 如果你的需求是只在特定年份(例如,仅针对“2023”)之后进行截断,你可以将 \d{4} 替换为具体的年份,如 (?<=\b2023\b).*。
    • 方法二的 \d{4} 同样匹配任意四位数字年份。如果你需要匹配特定年份,可以直接将 \d{4} 替换为 2023。
  2. 方法选择

    • str.replace 结合正向后行断言:当你的目标是“移除某个模式之后的所有内容”时,此方法非常直观和高效。它不关心年份之前的日期格式,只要能识别年份即可。
    • str.extract 进行模式匹配提取:当你知道你想要提取的确切模式(例如“日 月 年”)时,此方法更为精确。它直接提取符合模式的部分,对于格式相对固定的日期字符串非常有效。如果原始字符串中可能存在多个看起来像日期的模式,str.extract 会提取第一个匹配项。
  3. 效率考量

    • Pandas的str.replace和str.extract通常都经过优化,对于大多数数据集都能提供良好的性能。
    • 原始问题中提到的一种变体 df['date'].str.split(r'(?<=2023)', regex=True).str.get(0) 也可以实现类似功能,但它涉及两次str操作(split和get),通常会比单次str.replace或str.extract效率略低。在处理大规模数据时,应优先考虑单次操作的解决方案。

总结

本教程详细介绍了两种在Pandas DataFrame中清理日期字符串的有效方法,旨在保留日期至年份并移除所有后续冗余信息。通过str.replace结合正向后行断言,我们可以灵活地移除年份后的内容;而str.extract则允许我们精确地提取符合特定日期模式的字符串。理解并掌握这些正则表达式技巧,将大大提升你在数据预处理阶段的效率和准确性。选择哪种方法取决于你的具体需求和原始数据的特点。

以上就是Pandas DataFrame日期字符串处理:精确截取至年份并标准化日期格式的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号