我正在尝试将表从 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 数据帧读取时不允许使用此方法。
我认为您需要通过以下方式将日期时间列转换为 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}`',
)