Мне нужно найти разницу во времени (в минутах) между началом и моментом, когда col1 превышает значение 20.

Для данных ниже, ответ должен быть 72 минут (с 20:00:19 до 21:12:00).

df:

date_time            col1
2018-03-04 20:00:19  9
2018-03-04 21:10:00  13
2018-03-04 21:12:00  21
2018-03-04 21:15:00  25

Как мне это сделать? Это мой текущий фрагмент:

df.index = pd.to_datetime(df['date_time'])
start = df.index[0]
row_id = df.index[df['col1'] > 20]
time_val = start - df.index[row_id]
4
Tatik 3 Май 2019 в 00:10

5 ответов

Лучший ответ

После преобразования ваших столбцов в желаемый результат:

df.date_time=pd.to_datetime(df.date_time)
df.col1=pd.to_numeric(df.col1)
id=df[df.col1>20].col1.idxmin()
diff=(df.iloc[id].date_time-df.iloc[0].date_time).seconds/60
1
Juan C 2 Май 2019 в 21:28

Предполагая, что 'date_time' является типом-временем dtype. Мы можем использовать diff для получения Timedelta и cumsum для накопления Timedelta. Тогда мы можем использовать idxmax на df.col1.gt(20)

df.date_time.diff().fillna(0).cumsum()[df.col1.gt(20).idxmax()]

Timedelta('0 days 01:11:41')

Timedelta имеет метод total_seconds, который можно разделить на 60

df.date_time.diff().fillna(0).cumsum()[df.col1.gt(20).idxmax()].total_seconds() / 60

71.68333333333334

Или вы можете разделить на другое Timedelta

df.date_time.diff().fillna(0).cumsum()[df.col1.gt(20).idxmax()] / pd.Timedelta(1, unit='m')

71.68333333333334
3
piRSquared 2 Май 2019 в 21:35

Один лайнер:

ans = pd.to_datetime(df.groupby(df.col1>20).first().date_time).diff().dt.total_seconds()/60

Выход:

ans[True]:

71.68333333333334
4
Yuca 2 Май 2019 в 21:29

Вы можете попробовать это:

for index, row in df1.iterrows():
    if row['col'] > 20:
        total_seconds = int((df1['date_time'][0] - row['date_time']).total_seconds())
        minutes, remainder = divmod(total_seconds,60)
        print('{} mins'.format(minutes))
        break
0
RenauV 2 Май 2019 в 21:27

IIUC Я использую ptp

df.loc[df.col1.le(20).shift().cumprod().ne(0),'date_time'].ptp()
Out[1232]: Timedelta('0 days 01:11:41')
2
YO and BEN_W 2 Май 2019 в 21:50