Ответ Джоша (метод А) работает на моем компьютере, однако не работает на компьютере моего коллеги.На компьютере моего коллеги нам нужно было использовать другой loc (метод B).Мой коллега утверждал, что метод А пытался поместить весь столбец в каждую строку.Метод B работает для меня и для моего коллеги, поэтому я отредактирую ответ Джоша на это.
Метод A
import datetime as dt
df = pd.DataFrame({'A': [dt.datetime(2017,1,6), dt.datetime(2017,1,4)],
'B': [dt.datetime(2017,1,7), dt.datetime(2017,1,5)],
'C': [dt.datetime(2017,1,6,12,3), dt.datetime(2017,1,6,13,3)],
'D': [dt.datetime(2017,1,8,12,3), dt.datetime(2017,1,8,14,3)]})
# default is 0
df['dT_A'] = 0
df['dT_B'] = 0
df.loc[df.A < df.C, 'dT_A'] = df.C - df.A
df.loc[df.A > df.D, 'dT_A'] = df.A - df.D
df.loc[df.B < df.C, 'dT_B'] = df.C - df.B
df.loc[df.B > df.D, 'dT_B'] = df.B - df.D
# convert timedelta to number of days, to float
df['dT_A'] = df.dT_A / dt.timedelta(days=1)
df['dT_B'] = df.dT_B / dt.timedelta(days=1)
Метод B
import datetime as dt
df = pd.DataFrame({'A': [dt.datetime(2017,1,6), dt.datetime(2017,1,4)],
'B': [dt.datetime(2017,1,7), dt.datetime(2017,1,5)],
'C': [dt.datetime(2017,1,6,12,3), dt.datetime(2017,1,6,13,3)],
'D': [dt.datetime(2017,1,8,12,3), dt.datetime(2017,1,8,14,3)]})
# default is 0
df['dT_A'] = 0
df['dT_B'] = 0
df.loc[df.A < df.C, 'dT_A'] = (df.C - df.A) .loc[df.A < df.C]
df.loc[df.A > df.D, 'dT_A'] = (df.A - df.D) .loc[df.A > df.D]
df.loc[df.B < df.C, 'dT_B'] = (df.C - df.B) .loc[df.B < df.C]
df.loc[df.B > df.D, 'dT_B'] = (df.B - df.D) .loc[df.B > df.D]
# Convert timedelta to float, number of days
df['dT_A'] = df.dT_A / np.timedelta64(1, 'D')
df['dT_B'] = df.dT_B / np.timedelta64(1, 'D')