首页 > 解决方案 > 在 DataFrame 'ValueError: Lengths must match to compare' 中选择两个日期之间的数据

问题描述

我想选择我的大 2 个日期之间的所有值df_data。当我在循环之外为一天的数据执行此操作时,这很有效:

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)转换它们等并没有帮助。如何获得与datetime相同的格式,以便仅基于和之间的日期进行创建?to_datetimeto_pydatetimetwelveearliertwelvelaterdf_data[]dftwelveearliertwelvelater

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)

标签: pandaspython-2.7dataframedatetimetypes

解决方案


您正在尝试将日期时间与长度为 1 的日期时间的 DatetimeIndex 进行比较。这是因为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)] 

推荐阅读