如何用pandas解析部分日期时间字符串并获取时间值与精度
时间字符串解析+精度获取解决方案
方案一:自定义规则实现(推荐,兼容性强)
不依赖pandas内部未公开接口,适配性更强,可自行扩展支持更多时间格式:
import pandas as pd import re # 按精度从高到低定义匹配规则,可根据实际输入格式扩展 DATETIME_RULES = [ (r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{1,6}$', 'microsecond'), (r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$', 'second'), (r'^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$', 'minute'), (r'^\d{4}-\d{2}-\d{2} \d{2}$', 'hour'), (r'^\d{4}-\d{2}-\d{2}$', 'day'), (r'^\d{4}-\d{2}$', 'month'), (r'^\d{4}$', 'year'), ] def parse_datetime_with_precision(dt_str: str): # 先解析得到补全后的时间戳 full_ts = pd.Timestamp(dt_str) # 匹配对应精度 for pattern, precision in DATETIME_RULES: if re.fullmatch(pattern, dt_str.strip()): return full_ts.strftime('%Y-%m-%d %H:%M:%S.%f'), precision raise ValueError(f"不支持的时间字符串格式:{dt_str}")
测试示例
- 输入
parse_datetime_with_precision("2021-01-06 12")
输出:('2021-01-06 12:00:00.000000', 'hour') - 输入
parse_datetime_with_precision("2020-03")
输出:('2020-03-01 00:00:00.000000', 'month') - 输入
parse_datetime_with_precision("2020-03-01")
输出:('2020-03-01 00:00:00.000000', 'day')
方案二:调用pandas内部函数(仅适合固定pandas版本场景)
该方法依赖pandas未公开的内部接口,升级pandas版本可能出现接口变更、导入失败的问题:
import pandas as pd from pandas._libs.tslibs import parsing # 内部返回的精度枚举映射 RESO_MAP = { 0: 'year', 1: 'month', 2: 'day', 3: 'hour', 4: 'minute', 5: 'second', 6: 'microsecond', 7: 'nanosecond' } def parse_with_internal_func(dt_str: str): dt64_val, reso_code = parsing.parse_datetime_string_with_reso(dt_str) full_ts = pd.Timestamp(dt64_val) return full_ts.strftime('%Y-%m-%d %H:%M:%S.%f'), RESO_MAP.get(reso_code, 'unknown')
如果出现导入失败的情况,可通过dir(parsing)查看当前版本pandas的parsing模块下的可用函数,确认函数名是否有变更。
内容的提问来源于stack exchange,提问作者EZLearner
相关产品推荐
相关产品推荐

