#python-3.x #dataframe #datetime #elasticsearch
Вопрос:
Приветствую Вас, Цветочки
Я использовал (eland для вставки фрейма данных pandas в качестве документа elasticsearch. Код, используемый для этого, показан следующим образом и сильно основан на коде, указанном в URL
import eland as ed
def save_to_elastic(data_df, elastic_engine, index_name, type_overrides_dict, chunk_size):
"""
es_type_overrides={
"fechaRegistro": "date",
"fechaIncidente": "date"
}
"""
df = ed.pandas_to_eland(
pd_df=data_df,
es_client=elastic_engine,
# Where the data will live in Elasticsearch
es_dest_index=index_name,
# Type overrides for certain columns, the default is keyword
# name has been set to free text and year to a date field.
es_type_overrides=type_overrides_dict,
# If the index already exists replace it
es_if_exists="replace",
# Wait for data to be indexed before returning
es_refresh=True,
chunksize=chunk_size
)
Я использовал для вставки фрейма данных pandas в elasticsearch следующим образом:
from snippets.elastic_utils import save_to_elastic, conect2elastic
es = conect2elastic(user='falconiel')
save_to_elastic(data_df=siaf_consumados_elk,
type_overrides_dict={'fechaRegistro':"date",
'fechaIncidente':"date"},
elastic_engine=es,
index_name='siaf_18032021_pc',
chunk_size=1000)
Все работает нормально, но как только я получил документ в elasticsearch, 26 дат были неправильно вставлены в elasticsearch. Все мои данные начинаются с 1 января 2015 года. Но elasticsearch показывает некоторые документы с 31 декабря 2014 года. Я не смог найти этому объяснения. Почему некоторые строки в фрейме данных pandas, в которых указано правильное поле даты (с 2015-01-01), были изменены во время загрузки до последнего дня декабря предыдущего года. Я был бы признателен за любую помощь или понимание, чтобы исправить это поведение.
Мои столбцы datetime в фрейме данных pandas вводятся как datetime. Тем не менее, я пытаюсь протестировать следующие преобразования для решения этой проблемы. К настоящему времени они уже не были столь продуктивны:
Я попытался использовать следующие преобразования перед вставкой, вызывая функцию, которую я использую для сохранения во фрейме данных в elastic:
siaf_consumados_elk.fechaRegistro = pd.to_datetime(siaf_consumados_elk.fechaRegistro).dt.tz_localize(None)
siaf_consumados_elk.fechaRegistro = pd.to_datetime(siaf_consumados_elk.fechaRegistro, utc=True)
Комментарии:
1. Elasticsearch предполагает, что каждая получаемая им метка времени находится в UTC. вы работаете в другом часовом поясе в python?
2. Это хороший вопрос @MarkWalkom, я не знаю, как работает UTC Python. Дело в том, что столбцы в моем фрейме данных pandas, содержащие данные datetime, отформатированы в pandas как datetime. Однако, как только фрейм данных записывается в elastic, 26 дат меняются с 2015-01-01 на 2014-12-31.
Ответ №1:
На самом деле проблема в UTC. Я проверил некоторые строки в фрейме данных pandas, и они были сокращены почти на один день. Например, одна запись, которая была зарегистрирована в 2021-01-02 GMT -5, появилась как 2021-01-01. Решение состояло в том, чтобы применить соответствующий часовой пояс перед вызовом функции для сохранения кадра данных в виде эластичного документа/индекса. Итак, учитывая хорошее замечание Марка Уокома, это то, что я использовал перед вызовом функции:
siaf_consumados_elk.fechaRegistro = siaf_consumados_elk.fechaRegistro.dt.tz_localize(tz='America/Guayaquil')
siaf_consumados_elk.fechaIncidente = siaf_consumados_elk.fechaIncidente.dt.tz_localize(tz='America/Guayaquil')
Список с соответствующими часовыми поясами можно найти по адресу: часовые пояса python
Это позволило правильно проиндексировать время