将 Python 日期、时间或日期时间字符串转换为关联格式

问题描述 投票:0回答:1

问题

我正在开发一个Python应用程序,它分析用户输入,并尝试找出如何重新生成它。其中一部分是将任意格式的日期/时间/日期时间作为字符串提取,并检测格式是什么。

示例

  • 鉴于输入日期
    23-09-1992
    ,我应该能够生成格式
    %d-%m-%Y
  • 给定输入时间
    13:09
    ,我应该能够生成格式
    %h:%m

理想情况下,这应该通用,所以我可以提供任何常见的日期、时间或日期时间字符串,它会为我推断出格式。

我的尝试

  • 我试图建立一个已知日期时间/日期/时间格式的列表,但很快意识到我可以在这里直到我死,所以决定不这样做。

  • 我已经进入了

    dateutils.parser
    的代码,看看里面的东西是否有帮助,但我不认为它可以。看起来并没有生成格式,而是直接构建了
    datetime
    对象。

python date datetime parsing
1个回答
0
投票

dateutil 可以解析日期时间对象,但不直接提供使用的格式字符串。使用 dateutil.parser.parse 将输入字符串转换为日期时间对象。一旦我们有了 datetime 对象,我们就可以通过测试哪些 strftime 格式说明符与您获得的 datetime 对象的组件相匹配来对格式进行逆向工程。

import dateutil.parser
from datetime import datetime

def deduce_datetime_format(date_string):
    try:
        # Parse the date string into a datetime object
        parsed_date = dateutil.parser.parse(date_string, fuzzy=True)

        # Create a dictionary of datetime components
        components = {
            "%d": parsed_date.day,
            "%m": parsed_date.month,
            "%Y": parsed_date.year,
            "%H": parsed_date.hour,
            "%M": parsed_date.minute,
            "%S": parsed_date.second
        }

        # Try to match the format by reconstructing the string from components
        format_string = ""
        for key in components:
            if components[key] != 0:  # Check if the component is part of the input string
                if datetime.strftime(parsed_date, key) == str(components[key]).zfill(2):
                    format_string += key
                elif datetime.strftime(parsed_date, key).lstrip("0") == str(components[key]):
                    format_string += key.lstrip("%0")

        return format_string.replace("%", "%-").replace("-", "0")  # Construct strftime format string
    except ValueError:
        return "Invalid date string"

# Example usage
date_format = deduce_datetime_format("23-09-1992")
time_format = deduce_datetime_format("13:09")
print(f"Date format: {date_format}")
print(f"Time format: {time_format}")

这个脚本非常基础,可能需要根据您期望处理的输入范围进一步完善。

© www.soinside.com 2019 - 2024. All rights reserved.