将 datetime64[ns] 列加载到 BQ 表

问题描述 投票:0回答:1

我正在尝试将表从 pandas 数据帧加载到 BQ 表。我导入的列之一的类型为 datetime64[ns]。即使我在任何地方都没有收到错误,但条目的格式是错误的。这是代码和输出:

from google.cloud import bigquery

client = bigquery.Client()
table_id = "test_table"

schema = [
    bigquery.SchemaField("columnA", "TIMESTAMP", mode="REQUIRED"),
    # Add other schema fields as needed
]

job_config = bigquery.LoadJobConfig(
    schema=schema,
    write_disposition="WRITE_TRUNCATE"
)

job = client.load_table_from_dataframe(df, table_id, job_config=job_config)
job.result()  # Wait for the job to complete

table = client.get_table(table_id)

我得到的不是日期时间列的“YYYY-MM-DD”格式的预期输出,而是一个长整数,例如“XXXXXXXXXXXXXXXXXXXXX”

我尝试根本不指定架构中的列类型,但得到了相同的输出。 我尝试在 job_config 中添加 source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON,但据我了解,从 pandas 数据帧读取时不允许使用此方法。

google-cloud-platform google-bigquery
1个回答
0
投票

我认为您需要通过以下方式将日期时间列转换为 UNIX 时间戳:

import pandas as pd

df['date'] = (df['date'] - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')

根据评论进行编辑: 你可以使用一个名为

pandas_gdq
:

的附加包来做到这一点
from pandas_gbq import to_gbq

project_id = 'your-project-id'
dataset_id = 'your-dataset-id'
table_id = 'test_table'

to_gbq(
    df,
    f'{project_id}.{dataset_id}.{table_id}',
    project_id=project_id,
    if_exists='replace',
    table_schema=schema,
    progress_bar_type=None,
    table_config=job_config,
    if_exists='replace',
    if_exists='replace',
    query=f'SELECT *, TIMESTAMP_SECONDS(CAST(columnA AS INT64)) AS columnA FROM `{project_id}.{dataset_id}.{table_id}`',
)
© www.soinside.com 2019 - 2024. All rights reserved.