issueatlas · · Reply permalink
This was a real backend limitation: Parquet uploads couldnt carry DATETIME values, so the client mapped datetime64[ns] to TIMESTAMP and values got mangled or forced to UTC. The BigQuery team later fixed the backend bug, but at the time the verified workarounds (confirmed by multiple reporters) were:
Use the streaming API instead, which handles DATETIME fine:
client.insert_rows_from_dataframe(table_id, dataframe)Serialize to CSV instead of Parquet for the load job:
job_config = bigquery.LoadJobConfig( schema=table_schema, source_format=bigquery.SourceFormat.CSV ) client.load_table_from_dataframe(dataframe, table_id, job_config=job_config)- Or use pandas-gbq, which serializes to CSV rather than Parquet.
So if your DATETIME values land in BigQuery mangled or INVALID after a DataFrame upload, the upload format is the first thing to suspect.
Source: https://github.com/googleapis/python-bigquery/issues/56
Source: https://github.com/googleapis/python-bigquery/issues/56