Выбор данных между двумя датами в кадре данных «ValueError: длины должны совпадать для сравнения» - PullRequest
0 голосов
/ 03 февраля 2020

Я хочу выбрать все значения между двумя датами в моем большом df_data. Это работает, когда я делаю это вне al oop для данных за один день:

df_data['datetime'] = pd.to_datetime(df_data['TimeStamp'] )
twelveearlier = datetime.datetime(2017, 12,23, 00,00, 00)
twelvelater = datetime.datetime(2017, 12, 24, 00, 00, 00)

df = df_data[(df_data['datetime']>= twelveearlier) &
         (df_data['datetime']< twelvelater)]

Но когда я пытаюсь сделать это, просматривая список дат ниже, я получаю ValueError: Lengths must match to compare ,

event_name_list = ['noEvent_20161208174900', 'NoEvent_20161209174200', 'NoEvent20161211_061400']

    for event in event_name_list:
        event_time = re.findall(r'\d+', event)
        event_timestamp = pd.to_datetime(event_time)
        twelvelater = event_timestamp + datetime.timedelta(hours=12)
        twelveearlier = event_timestamp - datetime.timedelta(hours=12)

        df = df_data[(df_data['datetime']>= twelveearlier.values) &
                 (df_data['datetime']< twelvelater.values)]

Я думаю, это потому, что двенадцатилетний и двенадцатилетний являются разными типами в версии цикла из-за использования event_timestamp - datetime.timedelta(hours=12), но преобразовывают их с использованием to_datetime, to_pydatetime et c. не помогает Как получить twelveearlier и twelvelater в том же формате, что и df_data[ datetime ], чтобы я мог создать df на основе только дат между twelveearlier и twelvelater?

df_data['datetime']
3250592   2017-12-31 23:40:00
3250593   2017-12-31 23:50:00
Name: datetime, dtype: datetime64[ns]

print event_timestamp
DatetimeIndex(['2016-12-16 06:22:29'], dtype='datetime64[ns]', freq=None)

print twelveearlier
DatetimeIndex(['2016-12-08 05:49:00'], dtype='datetime64[ns]', freq=None)

print twelvelater
DatetimeIndex(['2016-12-09 05:49:00'], dtype='datetime64[ns]', freq=None)

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Вы пытаетесь сравнить со списком дат: twelvelater.values дает вам массив из одного элемента.

Это означает, что вы пытаетесь сопоставить фрейм данных с «несколькими» элементами в условном [[datetime]]. Только взятие первого элемента каждого из этих массивов даты и времени twelvelater.values[0] должно решить проблему с минимальными изменениями кода.

event_name_list = ['noEvent_20161208174900', 'NoEvent_20161209174200', 'NoEvent20161211_061400']

for event in event_name_list:
        event_time = re.findall(r'\d+', event)
        event_timestamp = pd.to_datetime(event_time)
        twelvelater = event_timestamp + datetime.timedelta(hours=12)
        twelveearlier = event_timestamp - datetime.timedelta(hours=12)

        df = df_data[(df_data['datetime']>= twelveearlier.values[0]) &
                 (df_data['datetime']< twelvelater.values[0])]
1 голос
/ 03 февраля 2020

Вы пытаетесь сравнить datetime с DatetimeIndex datetime длиной один. Это потому, что re.findall возвращает список всех найденных совпадений. Попробуйте это:

event_name_list = pd.to_datetime([re.findall(r'\d+', x)[0] for x in event_name_list])

for event_timestamp in event_name_list:
        twelvelater = event_timestamp + datetime.timedelta(hours=12)
        twelveearlier = event_timestamp - datetime.timedelta(hours=12)
        df = df_data[(df_data['datetime']>= twelveearlier) &
                     (df_data['datetime']< twelvelater)] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...