如何用Python将特定格式的frame.time转换为Unix时间戳?
问题:将JSON中的特定时间格式转换为Unix时间戳
场景说明
JSON数据中存在如下格式的时间字段:
"frame.time": "Dec 7, 2023 06:55:20.320000000 Mitteleuropäische Zeit"
需要通过Python将其转换为Unix时间戳用于导出CSV,但运行代码时出现格式匹配错误。
原代码问题分析
原代码存在以下关键错误:
- 字段获取错误:代码中使用
ev['_source']['layers']['frame'].get('frame.time_epoch', {}),但实际JSON中对应的字段是frame.time,导致获取的时间值无效。 - 格式字符串不匹配:
- 错误在格式串中添加了
utf-8,这不属于时间格式的一部分 - 原时间的纳秒部分(
.320000000)用%f无法匹配(%f仅处理6位微秒) - 时区名称因编码问题乱码(错误信息中显示为
Mitteleuropäische Zeit),导致格式匹配失败
- 错误在格式串中添加了
- 未处理时区转换:未指定时区信息,无法准确生成基于UTC的Unix时间戳
修正方案
方案1:使用pandas处理
修正字段获取、格式字符串,并正确处理时区:
import pandas as pd import json from zoneinfo import ZoneInfo # Python3.9+ 可用,低版本可替换为pytz # 假设ev为单条JSON数据 frame_time = ev['_source']['layers']['frame'].get('frame.time') # 中欧时间对应时区标识符为'Europe/Berlin' dt_object = pd.to_datetime( frame_time, format="%b %d, %Y %H:%M:%S.%f000 Mitteleuropäische Zeit", errors='raise' ).tz_localize('Europe/Berlin').tz_convert('UTC') # 转换为Unix时间戳(保留小数) unix_timestamp = dt_object.timestamp() extracted_values.append({ "[1] frame.number": ev['_source']['layers']['frame']['frame.number'], "[2] frame.time": unix_timestamp }) # 写入文件时指定UTF-8编码避免乱码 with open('extracted_values.json', 'w', encoding='utf-8') as f: json.dump(extracted_values, f, indent=2, separators=(', \n', ': '), ensure_ascii=False)
方案2:使用标准库datetime处理
不依赖pandas,用Python标准库实现:
import json from datetime import datetime from zoneinfo import ZoneInfo frame_time = ev['_source']['layers']['frame'].get('frame.time') # 拆分时间字符串,分离时区部分 time_part, _ = frame_time.rsplit(' ', 1) # 去掉纳秒后三位0,转为微秒格式 dt_str = time_part[:-3] dt = datetime.strptime(dt_str, "%b %d, %Y %H:%M:%S.%f") # 指定时区并转换为UTC dt_berlin = dt.replace(tzinfo=ZoneInfo('Europe/Berlin')) dt_utc = dt_berlin.astimezone(ZoneInfo('UTC')) # 生成Unix时间戳 unix_timestamp = dt_utc.timestamp() extracted_values.append({ "[1] frame.number": ev['_source']['layers']['frame']['frame.number'], "[2] frame.time": unix_timestamp }) with open('extracted_values.json', 'w', encoding='utf-8') as f: json.dump(extracted_values, f, indent=2, separators=(', \n', ': '), ensure_ascii=False)
关键注意点
- 读取和写入文件时指定
encoding='utf-8',避免时区名称乱码 - 中欧时间对应时区标识符
Europe/Berlin,会自动处理夏令时切换 - Unix时间戳基于UTC,必须将本地时间转换为UTC后再生成
内容的提问来源于stack exchange,提问作者DHAVAL TARAPRA
相关产品推荐
相关产品推荐

