首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配2列中最近的日期时间值的熊猫.类型整数/长误差

匹配2列中最近的日期时间值的熊猫.类型整数/长误差
EN

Stack Overflow用户
提问于 2018-03-23 01:38:54
回答 1查看 885关注 0票数 2

我有一个DataFrame,D1:

代码语言:javascript
复制
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,我正在尝试两种方法来识别' date‘值(最接近的匹配),它最接近'ICO_to’日期值(所有行都有相同的值)。首先,我尝试截断,这应该删除到那个日期值的行:

代码语言:javascript
复制
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

然而,我得到了这个错误:

代码语言:javascript
复制
TypeError: Cannot compare type 'Timestamp' with type 'long'

嗯,我知道这些是日期-时间值,所以不确定交易是什么。ICO_to变量是时间戳。我试一试:

代码语言:javascript
复制
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 

使用这个而不是截断,我得到了这个错误:

代码语言:javascript
复制
TypeError: an integer is required 

如何识别最接近于ICO_to值的日期值,或者通过截断删除最接近匹配的所有行?这两种方法都有用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-23 01:48:13

如果将行转换为datetime对象,则只需对列进行简单的计算,就可以找到绝对最小距离。

代码语言:javascript
复制
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排序以确保排序,然后对所有小于或等于最小值的索引进行切片。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49441095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档