比较两个几乎相同的Pandas Series / DataFrame

时间:2016-12-01 14:26:01

标签: python unit-testing pandas

对于unittest,我必须比较两个pandas DataFrames(有一列,所以它们也可以转换为Series而不会丢失信息)。问题是一个索引是datetime类型,另一个是日期。出于我们的目的,两者中的信息是相同的,因为不使用日期时间的时间分量。

要检查两个对象是否相等,我可以:

  • 提取其中一个的索引并转换为日期/日期时间
  • 仅提取一列的值,比较这些值以及开始和结束日期

我错过了比较两者的优雅方式吗?

代码示例:

from datetime import date, datetime, timedelta
import pandas as pd

days_in_training = 40
start_date = date(2016, 12, 1)
dates = [start_date + timedelta(days=i) for i in range(days_in_training)]
actual = pd.DataFrame({'col1': range(days_in_training)}, index=dates)

start_datetime = datetime(2016, 12, 1)
datetimes = [start_datetime + timedelta(days=i) for i in range(days_in_training)]
expected = pd.DataFrame({'col1': range(days_in_training)}, index=datetimes)

assert(all(actual == expected))

给出:

ValueError: Can only compare identically-labeled DataFrame objects

1 个答案:

答案 0 :(得分:1)

供将来参考,通过此博文(https://penandpants.com/2014/10/07/testing-with-numpy-and-pandas/),我找到了函数pandas.util.testing.assert_frame_equal()https://github.com/pandas-dev/pandas/blob/29de89c1d961bea7aa030422b56b061c09255b96/pandas/util/testing.py#L621

此功能在测试时具有一定的灵活性。此外,它打印一个摘要,为什么DataFrame可能不被认为是相等的,行assert(all(actual == expected))只返回True或False,这使得调试更加困难。