我有一个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





对于每个This link,我正在尝试两种方法来标识最接近“ ICO_to”日期值(所有行具有相同值)的“ Date”值(最匹配)。首先,我尝试截断,这将删除直到该Date值的行:

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值的Date值,或通过截断删除最接近的匹配之前的所有行?两种方法都可以。

最佳答案

如果将行转换为日期时间对象,则只需对列进行简单的数学运算即可找到绝对的最小距离。

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进行排序以确保其排序,然后对所有小于或等于最小值的索引进行切片。

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

关于python - Pandas 在2列中匹配最接近的Datetime值-类型为整型/长错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49441095/

10-12 23:33