Pandas Сопоставление ближайших значений даты и времени в 2 столбцах - тип целочисленной/длинной ошибки

У меня есть DataFrame, D1:

Date	Symbol	ICO_to
    5/28/2017 18:00	MYST	5/30/2017
    5/29/2017 18:00	MYST	5/30/2017
    5/30/2017 18:00	MYST	5/30/2017
    6/1/2017 18:00	MYST	5/30/2017
    6/2/2017 18:00	MYST	5/30/2017
    6/3/2017 18:00	MYST	5/30/2017
    6/4/2017 18:00	MYST	5/30/2017
    6/5/2017 18:00	MYST	5/30/2017
    6/6/2017 18:00	MYST	5/30/2017

По этой ссылке я пытаюсь определить двумя способами Значение «Дата» (наиболее близкое совпадение), которое ближе всего к значению даты «ICO_to» (все строки имеют одинаковое значение). Сначала я пытаюсь усечь, что должно удалить строки до этого значения даты:

D1.Date = pd.to_datetime(D1.Date) 

D1.rename(columns={'ICO to': 'ICO_to'}, inplace=True)
D1.ICO_to = pd.to_datetime(D1.ICO_to)

ICO_to = D1['ICO_to'][0] #All values in this column are the same, I just want to reference that value
ICO_to = pd.to_datetime(ICO_to) # to make sure the value is a datetime

First_date_row = D1['Date'].truncate(before=ICO_to).iloc[-1] #Remove all rows not after/= to the ICO_to date value

Однако я получаю эту ошибку:

TypeError: Cannot compare type 'Timestamp' with type 'long'

Ну, я знаю, что это значения даты и времени, поэтому не уверен, в чем дело. переменная ICO_to является отметкой времени. Вместо этого я пробую это:

First_date_row = D1['Date'].loc[D1.index.get_loc(datetime.datetime(D1['ICO_to'][0]),method='nearest')] #Identify the row where 'Date' nearest matches 'ICO_to' value at row 0 

Используя это вместо усечения, я получаю эту ошибку:

TypeError: an integer is required 

Как я могу либо определить значение даты, которое наиболее близко соответствует значению ICO_to, либо удалить все строки до ближайшего совпадения путем усечения? Любой метод будет работать.


person Cole Starbuck    schedule 23.03.2018    source источник


Ответы (1)


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

import pandas as pd

D1.Date = pd.to_datetime(D1.Date)
D1.ICO_to = pd.to_datetime(D1.ICO_to)
D1[min(abs(D1.Date - D1.ICO_to)) == abs(D1.Date - D1.ICO_to)]

    Date    Symbol  ICO_to
1   2017-05-29 18:00:00 MYST    2017-05-30 00:00:00

Как видите, вам нужно быть немного осторожным с тем, что вы подразумеваете под закрытием. Поскольку у вас есть часовая информация о дате, но только день о времени ICO_to, вы имеете в виду полночь или вы имеете в виду полдень или вообще любое время в течение дня? Последний вариант немного усложнит этот метод.

Если вы хотите, чтобы все части фрейма данных соответствовали этому значению, вы можете сделать это. Сначала отсортируйте DataFrame, чтобы убедиться, что он упорядочен, затем нарежьте его для всех индексов, меньших или равных тому, где встречается min.

D1.sort_values(by='Date', inplace=True)
D1.reset_index(drop=True)
D1[D1.index <= D1[min(abs(D1.Date - D1.ICO_to)) == abs(D1.Date - D1.ICO_to)].index[0]]

    Date    Symbol  ICO_to
0   2017-05-28 18:00:00 MYST    2017-05-30 00:00:00
1   2017-05-29 18:00:00 MYST    2017-05-30 00:00:00
person ALollz    schedule 23.03.2018
comment
Вы также можете заменить df.ICO_to только одной переменной даты, если вам это нужно для сравнения. На самом деле нет необходимости копировать значение во всем DataFrame - person ALollz; 23.03.2018
comment
Ваши ответы становятся лучше. +1 - person cs95; 23.03.2018
comment
Я понимаю, я когда-то был новичком (ну, до сих пор новичок). Раньше я спамил apply и отвечал на самые элементарные вопросы, не разбираясь в этом. Держитесь, вы скоро получите свой значок, если будете достаточно преданы делу. - person cs95; 23.03.2018
comment
Если я увижу, что вы отвечаете на вопрос, на который я тоже ответил, и если ваш ответ хорош, я без колебаний проголосую. Я был бы признателен, если бы вы сделали то же самое не только со мной, но и с моими коллегами, большинство из нас очень дружелюбны и готовы ответить на акт доброй воли :) (просто нужно оставить комментарий, чтобы они знали, что это вы ). - person cs95; 23.03.2018
comment
И COLDSPEED спасает положение! edit: Похоже, что усечение и метод loc здесь не будут работать, но хорошо, что если у вас есть два даты и времени, вы можете просто сравнить их так. Спасибо @ALollz - person Cole Starbuck; 23.03.2018
comment
Хорошо, здорово знать! Да, много времени я просто практикуюсь в решении задач. Как правило, вы и другие меня опередили, но за неделю я изучил довольно много новых функций и приемов. Я обязательно проголосую за хорошие ответы! - person ALollz; 23.03.2018