Разница во времени между периодом времени и мгновенным - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть несколько периодов времени (df_A) и несколько моментов времени (df_B):

import pandas   as pd
import numpy    as np
import datetime as dt
from   datetime import timedelta

# Data
df_A = pd.DataFrame({'A1': [dt.datetime(2017,1,5,9,8),   dt.datetime(2017,1,5,9,9),  dt.datetime(2017,1,7,9,19), dt.datetime(2017,1,7,9,19),  dt.datetime(2017,1,7,9,19), dt.datetime(2017,2,7,9,19), dt.datetime(2017,2,7,9,19)],
                     'A2': [dt.datetime(2017,1,5,9,9),   dt.datetime(2017,1,5,9,12), dt.datetime(2017,1,7,9,26), dt.datetime(2017,1,7,9,20),  dt.datetime(2017,1,7,9,21), dt.datetime(2017,2,7,9,23), dt.datetime(2017,2,7,9,25)]})

df_B = pd.DataFrame({ 'B': [dt.datetime(2017,1,6,14,45), dt.datetime(2017,1,4,3,31), dt.datetime(2017,1,7,3,31), dt.datetime(2017,1,7,14,57), dt.datetime(2017,1,9,14,57)]})

Я могу сопоставить их вместе:

# Define an Extra Margin
M = dt.timedelta(days = 10)

df_A["A1X"] = df_A["A1"] + M
df_A["A2X"] = df_A["A2"] - M

# Match
Bv = df_B .B  .values
A1 = df_A .A1X.values
A2 = df_A .A2X.values

i, j = np.where((Bv[:, None] >= A1) & (Bv[:, None] <= A2))

df_C = pd.DataFrame(np.column_stack([df_B .values[i], df_A .values[j]]),
                    columns = df_B .columns .append (df_A.columns))

Я хотел бы найти времяразница между каждым периодом времени и моментом времени, соответствующим ему.Я имею в виду, что

, если B находится между A1 и A2

, тогда dT = 0

Я пытался сделать это так:

# Calculate dT
def time(A1,A2,B):
    if   df_C["B"] < df_C["A1"]:
        return df_C["A1"].subtract(df_C["B"])
    elif df_C["B"] > df_C["A2"]:
        return df_C["B"].subtract(df_C["A2"])
    else:
        return 0

df_C['dT'] = df_C.apply(time)

Я получаю сообщение "ValueError: Невозможно установить фрейм без определенного индекса и значения, которое невозможно преобразовать в серию"

1 Ответ

0 голосов
/ 25 сентября 2018

Итак, я нашел два исправления:

  1. Вы добавляете M к более низкому значению и вычитаете из более высокого.Измените его на:

    df_A['A1X'] = df_A['A1'] - M
    df_A['A2X'] = df_A['A2'] + M
    
  2. За один раз вы передаете только одну строку вашего фрейма данных в функцию time, поэтому она должна выглядеть примерно так:

    def time(row):
        if row['B'] < row['A1']:
            return row['A1'] - row['B']
        elif row['B'] > row['A2']:
            return row['B'] - row['A2']
        else:
            return 0
    

    И тогда вы можете назвать это так:

    df_C['dT'] = df_C.apply(time, axis=1)
    
...