在时间戳中正确提供时区的情况下上传到Bigquery(防止自动UTC)

时间:2019-04-04 16:48:03

标签: python pandas datetime google-bigquery

如何将时区添加到上传到Bigquery(BQ)的数据帧时间戳中?

将包含时间戳记的数据帧上载到Google BQ时,您需要指定UTC偏移量或时区名称,以确保保留正确的时区。如果您不这样做,BQ会自动将您的时间戳转换为UTC。

BQ可以读取的时间戳格式具有以下规范格式:YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]][time zone]

我的问题是关于正确设置[time zone]部分。根据BQ文档:

字符串格式的时间戳可能包含一个时区。如果未明确指定时区,则使用默认时区UTC。时区由以下两种规范格式之一的字符串表示:

  • 世界标准时间(UTC)的偏移量或UTC的字母Z
  • tz数据库中的时区名称

我有一个数据框,其中包含通过以下命令转换为本地时区的时间戳:

df['date'].dt.tz_localize('UTC').dt.tz_convert('Europe/Berlin')

结果如下所示,并包含UTC偏移量:

2019-02-15 00:02:26+01:002019-04-01 00:03:40+02:00 (夏令时)

但是,当通过API将其上传到BQ时,值将转换为UTC。而且我收到以下值。

2019-02-15 00:01:26 UTC2019-04-01 00:01:40 UTC

BigQuery不接受我的时间戳格式怎么办?

我用以下代码行加载作业:

dataset_ref = client.dataset('dataset_name')
table_ref = dataset_ref.table('table_name')
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.write_disposition = 'WRITE_TRUNCATE'
client.load_table_from_dataframe(df, table_ref, job_config=job_config).result()

1 个答案:

答案 0 :(得分:1)

BigQuery不会将时区与TIMESTAMP值一起存储。当查询TIMESTAMP列时,如果希望结果反映出来,则需要传递一个时区,例如STRING (timestamp, '+02:00')。一种选择是将时区名称(或与UTC的小时偏差)存储在单独的列中。如果您希望查询结果使用该原始时区,则可以使用该列,例如STRING(timestamp, time_zone)