【发布时间】:2016-12-01 14:26:00
【问题描述】:
对于单元测试,我必须比较两个 pandas DataFrame(只有一列,因此它们也可以转换为 Series 而不会丢失信息)。问题是一个的索引是日期时间类型,另一个是日期。出于我们的目的,两者中的信息是相等的,因为没有使用日期时间的时间部分。
要检查两个对象在单元测试中是否相等,我可以:
- 提取其中之一的索引并转换为日期/日期时间
- 仅提取一列的值,比较这些值以及开始日期和结束日期
我错过了比较两者的优雅方式吗?
代码示例:
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
【问题讨论】:
-
试试
assert(all(actual.values == expected.values))这里.values返回一个 np 数组,因此不涉及索引 -
嗯,是的。这是我的建议之一,但它不会测试日期是否也匹配。我可以单独测试它,但我只是想知道是否有一个优雅的解决方案可以一次完成所有事情。
-
为什么不直接将索引转换为日期?
expected.index = expected.index.date,然后对齐 -
实际上
actual == expected已经对我有用了 -
你使用的是什么版本的 pandas/numpy?我的是 0.19.1 和 1.11.0
标签: python unit-testing pandas