You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按用户输入精度展示Pandas转换后的Datetime?

日期解析与自定义格式化需求

问题描述

需要读取用户定义的表格,其中部分列为日期,格式各不相同,示例如下:

'1998'
'2003-10-1'
'2003/5'
'2004/4/5 10:40'

使用Pandas的pd.to_datetime()可以成功解析这些日期,但展示时希望仅保留用户输入的日期精度,例如:

'1998' --> '1998'
'2003-10-1' --> '2003-10-1'
'2003/5' --> '2003-05'
'2004/4/5 10:40' --> '2004-04-05T10:40'

核心需求是避免仅输入年份(如'1998')时,展示为完整ISO DateTime格式1998-01-01T00:00。希望了解Pandas或Python是否提供原生支持;若没有,则计划强制用户遵循ISO 8601标准,通过正则提取日期组来自行实现。

自行实现的解决方案

因未找到Pandas原生解决方案,决定强制使用ISO 8601格式,并实现了以下函数:

import re
from pandas._libs.tslib import _test_parse_iso8601

def is_iso8601(string):
    try:
        _test_parse_iso8601(string)
        return True
    except ValueError:
        return False

def capture_iso_date(text):
    if not is_iso8601(text):
        raise ValueError("Date format not valid")
    
    date_parts = ["year", "month", "day", "hour", "minute", "second"]
    regex = r"(\d{4})(?:-(\d{2}))?(?:-(\d{2}))?(?:[\s,T](\d{2}))?(?::(\d{2}))?(?::(\d{2}))?"
    match = re.search(regex, text)
    # 解决代码检查工具的提示问题
    if match is None: raise ValueError("Date format not valid")
    
    date_list = match.groups()
    date_dict = {date_parts[i]: date_list[i] for i in range(len(date_list))}
    return date_dict

def format_iso_date(date_dict):
    ret: str = ""
    if date_dict['year']: ret += date_dict['year']
    else: return None
    if date_dict['month']: ret += "-" + date_dict['month']
    else: return ret
    if date_dict['day']: ret += "-" + date_dict['day']
    else: return ret
    if date_dict['hour']: ret += " " + date_dict['hour']
    else: return ret
    if date_dict['minute']: ret += ":" + date_dict['minute']
    else: return ret+':00'
    if date_dict['second']: ret += ":" + date_dict['second']
    else: return ret
    return ret

format_iso_date(capture_iso_date("2021-03-28T12"))

内容的提问来源于stack exchange,提问作者edoelas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:17:47