Я хочу, чтобы процентное изменение в двух временных столбцах (формат столбца-чч:мм:сс) в пандах

#python #pandas #datetime #pandas-groupby

Вопрос:

 import pandas as pd
import numpy as np
data = {'Name':['Si','Ov','Sp','Sa','An'],
    'Time1':['02:00:00', '03:02:00', '04:00:30','01:02:30','0'],
        'Time2':['03:00:00', '0', '05:00:30','02:02:30','02:00:00']}
        # Create DataFrame
df = pd.DataFrame(data)
# Print the output.
print (df)

 Output
    Name     Time1     Time2
0    Siya  02:00:00  03:00:00
1     Ovi  03:02:00         0
2  Spruha  04:00:30  05:00:30
3  Saanvi  01:02:30  02:02:30
4    Ansh         0  02:00:00
 

хотите добавить еще один столбец и применить формулу
Время 3=(Время 1-Время 2)/Время 2

Также существует значение 0 или nan.

Ответ №1:

Используйте to_timedelta для преобразования времени в временные интервалы:

 t1 = pd.to_timedelta(df['Time1'])
t2 = pd.to_timedelta(df['Time2'])
df['Time3'] = t1.sub(t2).div(t2)
print (df)
  Name     Time1     Time2     Time3
0   Si  02:00:00  03:00:00 -0.333333
1   Ov  03:02:00         0       inf
2   Sp  04:00:30  05:00:30 -0.199667
3   Sa  01:02:30  02:02:30 -0.489796
4   An         0  02:00:00 -1.000000
 

Редактировать:

Для добавления новой строки и столбца используйте:

 def format_timedelta(x):
    ts = x.total_seconds()

    hours, remainder = divmod(ts, 3600)
    minutes, seconds = divmod(remainder, 60)
    return ('{}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds)) 

    
t1 = pd.to_timedelta(df['Time1'])
t2 = pd.to_timedelta(df['Time2'])
df['Time3'] = t1.sub(t2).div(t2)

idx = len(df)
df.loc[idx] = (pd.concat([t1, t2], axis=1)
                     .sum()
                     .apply(format_timedelta))

df.loc[idx, ['Name','Time3']] = ['Total', df['Time3'].mask(np.isinf(df['Time3'])).sum()]
print (df)
    Name     Time1     Time2     Time3
0     Si  02:00:00  03:00:00 -0.333333
1     Ov  03:02:00         0       inf
2     Sp  04:00:30  05:00:30 -0.199667
3     Sa  01:02:30  02:02:30 -0.489796
4     An         0  02:00:00 -1.000000
5  Total  10:05:00  12:03:00 -2.022796
 

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

1. .Спасибо тебе. Это работает на меня. Я хочу добавить еще один вопрос: как добавить столбец общего итога в конце, который является общим итогом по столбцам?

2. @San — Use df['Grand'] = df['Time3'].sum() , Если мой ответ был полезен, не забудьте принять его. Спасибо.

3. Я хочу добавить столбец Время 1 раз 2 . Ответ должен быть в том же формате чч:мм:сс

4. @San — Как ты думаешь df['Time1'] , с df['Time2'] чем это связано ?

5. Нет.как сумма столбца Time1 в конце , сумма столбца time2 в конце.