Загрузка даты и времени python в Google BigQuery

#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()