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

如何解决含不规则秒数格式的时间字符串转datetime报错问题?

解决混合格式时间字符串转datetime并过滤数据的问题

问题出在你的时间字符串存在两种格式:一种带小数秒(如2023-08-04T13:33:33.614Z),一种不带小数秒(如2023-05-06T05:55:00Z),而strptime指定的%Y-%m-%dT%H:%M:%S.%fZ强制要求必须包含小数秒部分,导致不带小数的字符串匹配失败。

下面提供三种可行的解决方法:

方法一:用try-except兼容两种格式

先尝试解析带小数秒的格式,失败则切换到不带小数秒的格式:

from datetime import datetime

def filter_by_time(dictionary_list, start_date, end_date):
    filtered_list = []
    for entry in dictionary_list:
        time_str = entry['time']
        try:
            entry_time = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%fZ')
        except ValueError:
            entry_time = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%SZ')
        if start_date <= entry_time <= end_date:
            filtered_list.append(entry)
    return filtered_list

# 示例数据与输入逻辑不变
data = [
    {'name': 'Ana', 'city': 'New York', 'time': '2023-08-04T13:33:33.614Z'},
    {'name': 'John', 'city': 'Los Angeles', 'time': '2023-05-12T16:53:20.349Z'},
    {'name': 'Barney', 'city': 'Miami', 'time': '2023-05-09T16:49:20.752Z'},
    {'name': 'Gabriel', 'city': 'Seattle', 'time': '2023-05-06T05:55:00Z'}
]

start_date_input = input("Enter the start date (YYYY-MM-DD): ")
end_date_input = input("Enter the end date (YYYY-MM-DD): ")

start_date = datetime.strptime(start_date_input, '%Y-%m-%d')
end_date = datetime.strptime(end_date_input, '%Y-%m-%d')

filtered_data = filter_by_time(data, start_date, end_date)

print("Filtered data:")
for entry in filtered_data:
    print(entry)

方法二:预处理字符串统一格式

检查时间字符串是否包含小数部分,无小数则补全.000后再解析:

from datetime import datetime

def filter_by_time(dictionary_list, start_date, end_date):
    filtered_list = []
    for entry in dictionary_list:
        time_str = entry['time']
        # 补全小数秒部分
        if '.' not in time_str:
            time_str = time_str.rstrip('Z') + '.000Z'
        entry_time = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%fZ')
        if start_date <= entry_time <= end_date:
            filtered_list.append(entry)
    return filtered_list

# 示例数据与输入逻辑同方法一

方法三:使用fromisoformat(推荐,Python 3.7+支持)

Python 3.7及以上版本的datetime.fromisoformat可直接解析ISO 8601格式字符串,只需将结尾的Z替换为+00:00即可兼容:

from datetime import datetime

def filter_by_time(dictionary_list, start_date, end_date):
    filtered_list = []
    for entry in dictionary_list:
        time_str = entry['time']
        # 替换Z为+00:00,适配fromisoformat
        entry_time = datetime.fromisoformat(time_str.replace('Z', '+00:00'))
        if start_date <= entry_time <= end_date:
            filtered_list.append(entry)
    return filtered_list

# 示例数据与输入逻辑同方法一

这三种方法都能解决你的问题,其中方法三最简洁,无需手动维护格式字符串,是优先推荐的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:35:08