【发布时间】:2021-11-10 09:16:14
【问题描述】:
取自official doc:
解析时间戳或格式化时使用时区 用于显示的时间戳。时间戳值本身不存储 特定时区,当您应用时区时它也不会改变 偏移量。
时区由这两个规范之一中的字符串表示 格式:
- 与协调世界时 (UTC) 或字母 Z 表示 UTC 的偏移量
- tz 数据库中的时区名称
示例:2014-09-27 12:30:00.45 America/Los_Angeles
这就是我想要做的:
timestamp = dateutil.parser.isoparse(log['timestamp'])
log['local_timestamp'] = timestamp.strftime("%Y-%m-%d %H:%M:%S") + ' Europe/Zurich'
然后,通过 ApacheBeam Python Dataflow 作业,将此条目写入 BigQuery 并产生以下错误:
There were errors inserting to BigQuery. Will not retry. Errors were [{'index': 0, 'errors': [{'reason': 'invalid', 'location': 'local_timestamp', 'debugInfo': '', 'message': 'Unrecognized timezone: Europe/Zurich'}]}, {'index': 1, 'errors': [{'reason': 'invalid', 'location': 'local_timestamp', 'debugInfo': '', 'message': 'Unrecognized timezone: Europe/Zurich'}]}]
我尝试了不同的格式,例如在时间戳或不同位置的末尾附加+2:00,甚至如示例中所示的America/Los_Angeles。它们都导致无法识别的时区错误。似乎只有 UTC 有效。
是我做错了什么,还是文档不正确,只接受 UTC 时间戳?
谢谢!
【问题讨论】:
-
您能否提供有关您的设置的更多详细信息?从下面的评论中,您提到您正在使用 python 数据流作业。是否可以提供这项工作后的外观输出?也许它缺少一些特定的标志
",例如,如果您将在 bigquery 中使用Europe/Zurich,您可能会遇到问题,但如果您将使用"Europe/Zurich",那没关系。您是否也可以尝试使用:log['local_timestamp'] = timestamp.strftime("%Y-%m-%d %H:%M:%S") + '"Europe/Zurich"',添加"在时区。 -
嗨 Pjoter,感谢您的评论。你究竟想看什么?上面只写了修改时间戳的行,然后将条目写入 bigquery 表,就是这样。如果我尝试您的建议,我会收到另一个错误: [{'reason': 'invalid', 'location': 'local_timestamp', 'debugInfo': '', 'message': 'Could not parse \'2021-09 -16 11:32:11 "Europe/Zurich"\' 作为时间戳。所需格式为 YYYY-MM-DD HH:MM[:SS[.SSSSSS]]'}]}
-
您可以尝试使用
log['local_timestamp'] = timestamp.strftime("%Y-%m-%d %H:%M:%S") + '.0 Europe/Zurich'或timestamp.astimezone(pytz.timezone('Europe/Zurich'))吗? -
第一个选项我得到
'message': 'Unrecognized timezone: Europe/Zurich'第二个选项我做了timestamp.astimezone(pytz.timezone('Europe/Zurich')).strftime("%Y-%m-%d %H:%M:%S %Z")并得到'message': 'Unrecognized timezone: CEST'} -
@PjoterS 的解决方案对我来说听起来很合理。你能检查它是否在没有时间戳解析的情况下工作(
strftime):str(timestamp.astimezone(pytz.timezone('Europe/Zurich')))但直接使用产生字符串值的str()函数?
标签: python google-bigquery timezone dataflow pytz