
在数据分析和处理过程中,我们经常会遇到dataframe中日期列包含非标准格式、特殊字符或额外信息的情况。例如,日期字符串可能混杂着时间、冒号、空格等,这给直接的类型转换或格式化带来了挑战。本教程将介绍几种有效的方法来清洗和标准化这些复杂的日期字符串,使其符合分析需求。
如果您的最终目标是将日期字符串转换为Pandas的datetime对象,并且字符串中包含的额外信息不会完全破坏日期部分的识别,那么pd.to_datetime函数提供了一个非常便捷的参数:exact=False。
exact=False参数允许to_datetime在尝试解析日期时忽略字符串中的额外数据,只要日期部分能够被识别。这在处理日期前后有无关字符(如时间戳、冒号等)时非常有用。
示例数据:
import pandas as pd
import io
data = """id date
1 ' : 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)使用pd.to_datetime进行转换:
df['out'] = pd.to_datetime(df['date'], format='%d/%m/%Y', exact=False)
print("\n使用pd.to_datetime(exact=False)后的DataFrame:")
print(df)输出结果:
原始DataFrame: id date 0 1 : 07/01/2020 23:25 1 2 : 07/02/2020 2 3 07/03/2020 23:25 1 3 4 07/04/2020 4 5 23:50 07/05/2020 5 6 07 06 2023 6 7 00:00 07 07 2023 使用pd.to_datetime(exact=False)后的DataFrame: id date out 0 1 : 07/01/2020 23:25 2020-01-07 1 2 : 07/02/2020 2020-02-07 2 3 07/03/2020 23:25 1 2020-03-07 3 4 07/04/2020 2020-04-07 4 5 23:50 07/05/2020 2020-05-07 5 6 07 06 2023 2023-06-07 6 7 00:00 07 07 2023 2023-07-07
注意事项:
如果您的目标是提取纯净的日期字符串(例如DD/MM/YYYY格式),或者pd.to_datetime无法满足需求,那么结合正则表达式和str.extract方法是更灵活的选择。
对于形如DD/MM/YYYY的日期模式,我们可以构建一个精确的正则表达式来匹配。
正则表达式: (\d{2}\/\d{2}\/\d{4})
代码示例:
df['clean_slash'] = df['date'].str.extract(r'(\d{2}\/\d{2}\/\d{4})')
print("\n使用str.extract提取标准斜杠日期后的DataFrame:")
print(df)输出结果:
使用str.extract提取标准斜杠日期后的DataFrame: id date out clean_slash 0 1 : 07/01/2020 23:25 2020-01-07 07/01/2020 1 2 : 07/02/2020 2020-02-07 07/02/2020 2 3 07/03/2020 23:25 1 2020-03-07 07/03/2020 3 4 07/04/2020 2020-04-07 07/04/2020 4 5 23:50 07/05/2020 2020-05-07 07/05/2020 5 6 07 06 2023 2023-06-07 NaN 6 7 00:00 07 07 2023 2023-07-07 NaN
可以看到,对于以空格分隔的日期(如第6、7行),此正则未能匹配。
当日期字符串可能使用斜杠或空格作为分隔符时,我们需要一个更灵活的正则表达式来捕获这些模式,并随后进行标准化。
正则表达式: (\d{2}[ /]\d{2}[ /]\d{4})
代码示例:
df['clean_mixed'] = (df['date']
.str.extract(r'(\d{2}[ /]\d{2}[ /]\d{4})', expand=False)
.str.replace(' ', '/')
)
print("\n使用str.extract提取并标准化日期后的DataFrame:")
print(df)输出结果:
使用str.extract提取并标准化日期后的DataFrame: id date out clean_slash clean_mixed 0 1 : 07/01/2020 23:25 2020-01-07 07/01/2020 07/01/2020 1 2 : 07/02/2020 2020-02-07 07/02/2020 07/02/2020 2 3 07/03/2020 23:25 1 2020-03-07 07/03/2020 07/03/2020 4 4 07/04/2020 2020-04-07 07/04/2020 07/04/2020 5 5 23:50 07/05/2020 2020-05-07 07/05/2020 07/05/2020 6 6 07 06 2023 2023-06-07 NaN 07/06/2023 7 7 00:00 07 07 2023 2023-07-07 NaN 07/07/2023
通过这种方法,我们成功地提取了所有日期,并将其统一标准化为DD/MM/YYYY格式。
清洗Pandas DataFrame中的复杂日期字符串是一个常见的任务。本教程提供了两种主要的解决方案:
在实际应用中,选择哪种方法取决于您的具体需求和数据特点。通常,如果最终需要进行日期计算或时间序列分析,转换为datetime对象是首选;如果仅仅需要一个干净的日期字符串,那么正则表达式提取是更直接的路径。无论选择哪种方法,理解数据中日期字符串的模式是成功的关键。
以上就是Pandas DataFrame中复杂日期字符串的清洗与格式化教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号