#python-3.x #google-bigquery
#python-3.x #google-bigquery
Вопрос:
Я загружаю поле даты и времени из Pandas в Google BigQuery DATETIME и получаю следующую ошибку:
google.api_core.exceptions.BadRequest: 400 Error while reading data, error message: Invalid datetime value 1594835746000000 for field 'my field name' of type 'INT64' (logical type 'TIMESTAMP_MICROS'): generic::out_of_range: Cannot return an invalid datetime value of 1594835746000000 microseconds relative to the Unix epoch. The range of valid datetime values is [0001-01-1 00:00:00, 9999-12-31 23:59:59.999999]
Внутри Pandas объект определенно является объектом datetime.datetime и имеет действительную дату, и когда я беру 1594835746000000 через https://www.epochconverter.com / он возвращает действительную дату.
Я загружаю данные в BigQuery посредством вызова:
job_config = bigquery.LoadJobConfig(schema = schema_fieldlist)
job = bigquery_client.load_table_from_dataframe(df, f'{dataset}.{tablename}', job_config)
job.result()
где
schema_fieldlist — это массив, который для рассматриваемого поля определяется как:
bigquery.SchemaField('my field name', 'DATETIME')
Я не делаю ничего умного — кто-нибудь может посоветовать, получилось ли у них это работать и как? Я видел другие вопросы, связанные с возвратом временных меток и изменением допустимого диапазона между стандартными и устаревшими диалектами SQL
Комментарии:
1. Я считаю, что это может быть текущей текущей проблемой. Проверьте этот аналогичный трекер проблем. Я бы предложил попробовать ввести временную метку в качестве обходного пути и посмотреть, работает ли это в вашем случае.
2. Спасибо. Я согласен, что это выглядит одинаково, и переключение метки времени работает
3. pandas-gbq использует сериализацию CSV, а не Parquet. Вы также можете рассмотреть возможность его использования.
Ответ №1:
У меня тоже была эта проблема с датой и ВРЕМЕНЕМ (о чем сообщалось https://issuetracker.google.com/issues/169230812 ).
Вот соответствующие версии пакетов, которые я использую:
pyarrow==1.0.1
pandas==1.1.1
google-cloud-bigquery==1.28.0
numpy==1.19.1
ВРЕМЕННАЯ МЕТКА приемлема в качестве замены даты и времени, хотя и с подразумеваемым часовым поясом. Однако это не очень хорошая замена ВРЕМЕНИ.
Ответ №2:
У меня была аналогичная проблема при попытке вставить столбец pandas datetime.time в BigQuery с помощью bigquery.client.Client.load_table_from_dataframe.
Ошибка:
BadRequest: 400 Error while reading data, error message: Invalid time value 64176000000 for column 'time': generic::out_of_range: Cannot return an invalid time value of 64176000000 microseconds relative to the Unix epoch. The range of valid time values is [00:00:00, 23:59:59.999999]
Я нашел решение здесь: https://github.com/googleapis/python-bigquery/issues/382
Добавить source_format=bigquery.SourceFormat.CSV
в job_config
:
bq = bigquery.Client()
job_config = bigquery.LoadJobConfig(source_format=bigquery.SourceFormat.CSV)
job = bq.load_table_from_dataframe(df, "wb_dev_us.time_test", job_config=job_config)
job.result()