Что возвращает min(iterable, *[, key, default])

#python #arrays #pandas #for-loop #min

#python #массивы #панды #для цикла #min

Вопрос:

Для df приведенного ниже я хочу найти ближайшую дату и время для определенной временной метки, которая за одну минуту до текущей временной метки, из диапазона 10 значений до и после текущего Timestamp .

Но я наблюдал разные значения, возвращаемые для one_min_ago_data в разных случаях, иногда он возвращал Timestamp , в других случаях он возвращал целые строки как <class 'numpy.ndarray'> . Что min(iterable, *[, key, default]) возвращает? Что min() возвращает функция в этом случае? Я, вероятно, что-то здесь упустил, но я не уверен, что. Любой совет приветствуется.

df :

         Timestamp               A           B           C
912262  2001-02-10 00:01:45.910 45.5        NaN         zero
530129  2001-02-10 00:05:33.430 43.5        NaN         zero
243281  2001-02-10 00:07:05.600 45.0        NaN         zero
520580  2001-02-10 00:07:13.600 46.0        NaN         zero
228900  2001-02-10 00:07:23.600 47.0        NaN         zero
 

и код, который я использовал, выглядит примерно так:

 for i in range(1, len(df.index)):

    left_timestamp = df.loc[i - 10:i - 1]
    right_timestamp = df.loc[i   1:i   10]

    time_one_min_ago = df.loc[i, 'Timestamp'] - datetime.timedelta(minutes=1)

    one_min_ago_data = min(left_timestamp.append(right_timestamp).to_numpy(), key=lambda x: abs(x[timestamp_index] - time_one_min_ago))
 

Ответ №1:

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

 timestamp = df['Timestamp'].to_numpy()
l = len(timestamp)
win_size = 10

result = np.empty(l, dtype='datetime64[ns]')

for i, ts in enumerate(timestamp):
    # Take 10 rows from above and 10 from below, but not the current row
    lbound = max(i-win_size, 0)
    ubound = min(i win_size, l-1)   1
    tmp = timestamp.take([idx for idx in range(lbound, ubound) if idx != i])
    
    # Find the timestamp with the lowest distance from the current timestamp
    argmin = np.abs(tmp - ts).argmin()
    result[i] = tmp[argmin]
    
df['result'] = result
 

Комментарии:

1. Привет, спасибо за решение, вы знаете, как я могу принимать A значения, соответствующие tmp ? Я хочу определить их среднее значение.