
在数据分析和预处理过程中,我们经常会遇到日期字段包含非标准格式或额外信息的情况。例如,日期字符串可能包含时间戳、括号内的注释或其他无关字符,而我们通常只需要保留日期部分,精确到年份。本教程将展示如何利用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
接下来,我们将介绍两种主要的方法来实现这一目标。
这种方法利用正则表达式的正向后行断言 (Positive Lookbehind) 来定位年份,然后移除其后的所有内容。
str.replace 方法允许我们使用正则表达式来查找并替换字符串中的模式。通过在正则表达式中引入正向后行断言,我们可以指定一个模式必须紧跟在另一个模式之后,但不会将前一个模式包含在匹配结果中。
r'(?<=\b\d{4}\b).*'
我们将匹配到的.*部分替换为空字符串'',从而达到移除年份之后所有内容的目的。
# 方法一:使用 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 将返回这些捕获组的内容。
r'(\d+ [a-zA-Z]+ \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,这在提取单个捕获组时是常见的做法。
特定年份与任意四位年份的区别
方法选择
效率考量
本教程详细介绍了两种在Pandas DataFrame中清理日期字符串的有效方法,旨在保留日期至年份并移除所有后续冗余信息。通过str.replace结合正向后行断言,我们可以灵活地移除年份后的内容;而str.extract则允许我们精确地提取符合特定日期模式的字符串。理解并掌握这些正则表达式技巧,将大大提升你在数据预处理阶段的效率和准确性。选择哪种方法取决于你的具体需求和原始数据的特点。
以上就是Pandas DataFrame日期字符串处理:精确截取至年份并标准化日期格式的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号