Эланд загружает фрейм данных панд в elasticsearch, изменяет дату

#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

Это позволило правильно проиндексировать время