Pandas 匹配 2 列中最接近的日期时间值 - 类型 integer/long 错误
Pandas Matching nearest Datetime values in 2 columns - type integer/long error
我有一个 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
Per This link 我正在尝试两种方法来识别最接近 'ICO_to' 日期值(所有行具有相同值)的 '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 值的日期值,或通过截断删除最接近匹配之前的所有行?两种方法都可以。
如果将行转换为日期时间对象,则只需对列进行简单的数学运算即可找到绝对最小距离。
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
我有一个 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
Per This link 我正在尝试两种方法来识别最接近 'ICO_to' 日期值(所有行具有相同值)的 '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 值的日期值,或通过截断删除最接近匹配之前的所有行?两种方法都可以。
如果将行转换为日期时间对象,则只需对列进行简单的数学运算即可找到绝对最小距离。
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