如何解决含不规则秒数格式的时间字符串转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
相关产品推荐
相关产品推荐

