Pandas将数据框架与包含日期时间的系列进行比较

时间:2017-09-01 10:22:11

标签: python pandas datetime

我试图将Dataframe与Series进行比较,以检查df中的一行是否等于系列,例如

import pandas as pd
import datetime as dt

d = pd.DataFrame([[1, dt.datetime(1990,12,10)],
                  [2, dt.datetime(1990,12,11)]])
s = d.loc[0].copy()

print(d == s)  # or d.gt(s) which should do the same

这打破了以下错误

  

TypeError:int()参数必须是字符串,类字节对象或数字,而不是'时间戳'

比较values会产生预期结果:

d.values == s.values
array([[ True,  True],
       [False, False]], dtype=bool)

此错误也不是使用字符串引发的:

d = pd.DataFrame([[1, "a"], [2, "b"]])

s = d.loc[1].copy()

print(s == d)
#       0      1
#0   True   True
#1  False  False

这是熊猫中的错误还是我做错了什么?

编辑:

我使用python 3.6和pandas 0.20.3

我在pandas github上打开了一个问题: 17411

3 个答案:

答案 0 :(得分:1)

放弃信仰

如评论中所述(并且可能值得添加到问题中)这适用于字符串,所以我不明白为什么它不适用于datetimes

关于github here的讨论表明,与数字相比,日期时间是否应该是假的是一个持续的辩论。

如果您打印ds,则会收到以下信息:

d

   0          1
0  1 1990-12-10
1  2 1990-12-11

S:

0                      1
1    1990-12-10 00:00:00
Name: 0, dtype: object

在s中,左边的数字0,1是索引(这是s == d比较的关键字)所以你的代码正在比较11然后2针对1990-12-10 00:00:00 - 这就是您收到错误的原因。

为什么这适用于值 - .values返回没有索引的numpy数组,因此比较是在你期望的形状上完成而不是考虑索引。

答案 1 :(得分:0)

我认为问题在于您要比较两个不支持比较的对象。

我会尝试这样的事情:

d[d[1] == dt.datetime(1990,12,10)]

答案 2 :(得分:0)

问题是我的版本是0.20.3,这是通过pip或conda的最新版本。

Version 0.21,这是github上的最后一个开发版本似乎解决了这个问题。

只要版本0.21在pypi上,我就会删除这个问题