2016-12-01 197 views
0

對於單元測試,我必須比較兩個熊貓數據幀(有一列,所以它們也可以投射到系列而不會丟失信息)。問題是一個是日期時間類型的索引,另一個是日期。就我們的目的而言,由於日期時間的時間分量未被使用,所以兩者中的信息是相等的。比較幾乎相同的兩個熊貓系列/數據幀

要檢查兩個對象是相等的單元測試我能:

  • 提取其中之一的指標,並轉換爲日期/日期
  • 提取物中的一列剛值,比較那些和開始和結束日期

我缺少任何優雅的方式來比較兩個?

代碼例如:

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 
+0

嘗試'assert(all(actual.values == expected.values))''here .values'返回一個np數組,因此不涉及索引 – EdChum

+0

嗯,是的。這是我的建議之一,但它不測試日期是否匹配。我可以單獨測試,但我只是想知道是否有一個優雅的解決方案,一次做所有事情。 –

+1

爲什麼不直接將索引轉換爲日期? 'expected.index = expected.index.date',那麼它實際上會對齊 – EdChum

回答

0

供將來參考,通過這個博文(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

這個函數有一定的靈活性在測試中。此外,它還打印了一個摘要,爲什麼DataFrames可能不被認爲是相同的,則線路assert(all(actual == expected))只返回True或False,這會使調試更加困難。