import pandas as pd
import datetime
df = pd.DataFrame([{'st':datetime.datetime.strptime('21:00:00','%H:%M:%S').time(),'et':datetime.datetime.strptime('22:00:00','%H:%M:%S').time()}, {'st':datetime.datetime.strptime('1:00:00','%H:%M:%S').time(),'et':datetime.datetime.strptime('3:00:00','%H:%M:%S').time()}])


Out[183]: df
         et        st
0  22:00:00  21:00:00
1  03:00:00  01:00:00

Я хотел бы иметь возможность преобразовать указанный выше фрейм данных с новыми полями, имеющими объекты datetime.datetime с двумя другими дополнительными столбцами, например, здесь с фиктивной датой и использованием времени из соответствующих строк:

      et        st      sdate_time                edate_time
0  22:00:00  21:00:00   2018-01-01 21:00:00      2018-01-01 22:00:00  
1  03:00:00  01:00:00   2018-01-01 1:00:00       2018-01-01 3:00:00

Подход, который я попробовал, использует метод apply

df['et'].apply(lambda et: pd.datetime.combine(datetime.datetime.strptime('2018-01-01', '%Y-%m-%d').date(),et))

Но оказывается, что датафрейм может быть очень большим, и я хотел бы векторизовать вышеописанную операцию без применения метода apply.

3
Sujith Shivaprakash 23 Окт 2018 в 21:22

2 ответа

Лучший ответ

Попробуй это

date = str(datetime.datetime.strptime('2018-01-01', '%Y-%m-%d').date())

df['edate_time'] = pd.to_datetime(date + " " + df.et.astype(str))

       et          st            edate_time
0   22:00:00    21:00:00    2018-01-01 22:00:00
1   03:00:00    01:00:00    2018-01-01 03:00:00
2
ResidentSleeper 23 Окт 2018 в 18:38

Пытаться:

df.assign(sdate_time=pd.to_datetime(df['et'], format='%H:%M:%S'), 
          edate_time=pd.to_datetime(df['st'], format='%H:%M:%S'))

Выход:

         et        st          sdate_time          edate_time
0  22:00:00  21:00:00 1900-01-01 22:00:00 1900-01-01 21:00:00
1  03:00:00  01:00:00 1900-01-01 03:00:00 1900-01-01 01:00:00
1
Scott Boston 23 Окт 2018 в 18:40
52955534