Найти разницу в минутах между двумя столбцами на основе совпадения первых двух символов - PullRequest
1 голос
/ 12 апреля 2019

У меня есть этот фрейм данных, я пытаюсь найти разницу в минутах между датами 1 и 2, если первые два символа совпадают, и создать для этого столбец.Например, первая строка 22 = 22, а затем найдите разницу между 20:27:45 и 20: 52: 03

         Date1     Date2        ID     City
0   22 20:27:45   22 20:52:03   76    Denver
1   02 20:16:28   02 20:49:02   45    Austin
2   15 19:35:09   15 20:52:44   233   Chicago
3   30 19:47:53   30 20:18:01   35    Detroit
4   09 19:01:52   09 19:45:26   342   New York City

Это то, что я пробовал до сих пор:

(pd.to_datetime(data['Date1'].str[3:]).dt.minute - pd.to_datetime(data['Date2'].str[3:]).dt.minute)

Это прекрасно работает, но я хочу добавить это условие здесь.Я попытался создать функцию:

def f(data):
    if data['Date1'][:3] == data['Date2'][:3]:
        return pd.to_datetime(data['Date1'][3:]).dt.minute - pd.to_datetime(data['Date2'][3:]).dt.minute 

Ошибка получения:

AttributeError: ("'Timestamp' object has no attribute 'dt'", 'occurred at index 0')

Я знаю, что бессмысленно добавлять pd.to_datetime в объект серии, но как я могу преобразовать это вотметку времени и найти разницу в минутах?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Предполагая, что ваши столбцы даты в настоящее время являются строками, вы можете проанализировать целый день час: минута: вторая строка, а затем применить его на основе атрибута дня временной метки

Я изменил день одного иззначения, чтобы продемонстрировать, что происходит, если дни не равны

def diff_func(x):
    date_1 = pd.to_datetime(x.Date1, format='%d %H:%M:%S')
    date_2 = pd.to_datetime(x.Date2, format='%d %H:%M:%S')
    if date_1.day == date_2.day:
        return (date_2-date_1).seconds / 60
    else:
        return None

df['minute_difference'] = df.apply(diff_func, axis=1)



         Date1        Date2  minute_difference
0  22 20:27:45  22 20:52:03          24.300000
1  03 20:16:28  02 20:49:02                NaN
2  15 19:35:09  15 20:52:44          77.583333
3  30 19:47:53  30 20:18:01          30.133333
4  09 19:01:52  09 19:45:26          43.566667
1 голос
/ 12 апреля 2019

Вы можете использовать Series.str.slice для создания столбцов дня, затем pd.to_datetime для создания объектов даты и времени. И наконец, используйте np.where для условного заполнения нового столбца с именем Difference:

df['Date1_day'] = df['Date1'].str.slice(start=0, stop=3)
df['Date2_day'] = df['Date2'].str.slice(start=0, stop=3)
df['Date1'] = pd.to_datetime(df['Date1'].str.slice(start=3))
df['Date2'] = pd.to_datetime(df['Date2'].str.slice(start=3))

df['Difference'] = np.where(df['Date1_day'] == df['Date2_day'],
                            df['Date2'] - df['Date1'],
                            np.NaN)

df.drop(['Date1_day', 'Date2_day'], axis=1, inplace=True)

print(df)
                Date1               Date2   ID           City Difference
0 2019-04-11 20:27:45 2019-04-11 20:52:03   76         Denver   00:24:18
1 2019-04-11 20:16:28 2019-04-11 20:49:02   45         Austin   00:32:34
2 2019-04-11 19:35:09 2019-04-11 20:52:44  233        Chicago   01:17:35
3 2019-04-11 19:47:53 2019-04-11 20:18:01   35        Detroit   00:30:08
4 2019-04-11 19:01:52 2019-04-11 19:45:26  342  New York City   00:43:34
...