Поиск столбца в фрейме данных pandas

Следующее принимает user_time в качестве входных данных. И возвращает фактическое время, если оно существует в df['time'], или возвращает ближайшее время, независимо от того, на +1 или -1 опережает или отстает от указанных секунд. Диапазон не более +120 секунд. Так что, если его нет в 120 секунд, значит, его не существует.

#Following Format always 'yyyy-mm-dd hh:mm:ss' 
user_time = '2018-04-10 13:00:03'


if user_time not in df['time']:

        closest_time = 
        #df.loc[df['time'].str.contains(closest_time )]

Я не уверен, как найти ближайшее время, чтобы передать его функции и распечатать эту строку, если фактическое время не существует

1
0
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Скажите, что вы начинаете с

df = pd.DataFrame({
    't': pd.to_datetime(['2018-04-10 13:00:03', '2018-04-10 14:00:03'])})

потом

(df.t - pd.to_datetime('2018-04-10 23:00:03')).dt.total_seconds().abs().argmin()

находит индекс строки, абсолютное значение которой в секундах отличается от некоторого времени ('2018-04-10 23:00:03') наименьшим.

  • (df.t - pd.to_datetime('2018-04-10 23:00:03')) находит разницу во времени.
  • dt.total_seconds() преобразует разницу в общее количество секунд.
  • abs() принимает абсолютное значение.
  • argmin() возвращает индекс минимума.

Спасибо @MaxU за улучшение!

Нужен ли нам здесь apply? (df.t - pd.to_datetime('2018-04-10 23:00:03')).dt.total_seconds().abs().idxmin()

MaxU 11.04.2018 11:56

@AmiTavory, я не думаю, что вам тоже нужен .dt.total_seconds ()

shivsn 11.04.2018 11:59

@shivsn Да, спасибо - я поддержал ваш ответ за это.

Ami Tavory 11.04.2018 12:00
Ответ принят как подходящий

это должно работать нормально:

In [38]: sd = pd.DataFrame({'date':pd.date_range('2018-01-01 00:00:00','2018-01-5 00:00:00',freq='min')})

In [39]: sd['date'] = pd.to_datetime(sd['date'])

In [41]: sd.iloc[(sd['date'] - pd.to_datetime('2018-01-03 01:12:23')).abs().argsort()][:1]
Out[41]: 
                    date
2952 2018-01-03 01:12:00

или же

In [50]: sd.iloc[(sd['date'] - pd.to_datetime('2018-01-03 01:12:23')).abs().argmin()]
Out[50]: 
date   2018-01-03 01:12:00
Name: 2952, dtype: datetime64[ns]

Это хорошо, но учтите, что нет необходимости сортировать, чтобы найти минимум.

Ami Tavory 11.04.2018 11:59

@AmiTavory, да, я просто заменил его на argmin ().

shivsn 11.04.2018 12:00

@shivsn отлично работает! Могу я попросить вас добавить комментарии / пояснения в [41]. Спасибо !

user9238790 11.04.2018 12:41

Другие вопросы по теме