python - 如何使用当前时间戳测试 pandas DataFrame
问题描述
我将测试my_function(),它返回一个带有“utc_timestamp”列的 pandas DataFrame。此列包含当前时间戳。
def my_function():
df = pd.DataFrame(data=[[1, pd.datetime.utcnow()]], columns=['value', 'utc_timestamp'])
如何定义单元测试来测试my_function()的预期输出。显然下面的方法是行不通的,因为测试函数中的当前时间戳不等于创建数据帧时的时间戳。
class TestCase(unittest.TestCase):
df_out = my_function()
df_expected = pd.DataFrame(data=[[1, pd.datetime.utcnow()]], columns=['value', 'utc_timestamp'])
pd.testing.assert_frame_equal(df_out, df_expected)
>> AssertionError: DataFrame.iloc[:, 0] (column name="utc_timestamp") are different
哪一个是最专业、最pythonic、最pandas的方式?
解决方案
我不确定您是否已经找到了一种单元测试的方法,但这是一种对您的 DataFrame 进行单元测试的方法......
您必须修补pd.datetime.utcnow函数并将其设置为返回静态日期。然后,您可以使用断言语句来检查两个 DataFrame 是否相等。
import unittest
import pandas as pd
from unittest.mock import patch
from pandas.util.testing import assert_frame_equal
with patch('pandas.datetime.utcnow', return_value="2020-08-16 20:36:06.578174"):
actual = my_function()
expected = pd.DataFrame(data=[[1, "2020-08-16 20:36:06.578174"]], columns=['value', 'utc_timestamp'])
assert_frame_equal(actual, expected)
推荐阅读
- html - 为什么我在 Firefox (81.0.1) 中看到垂直滚动条,但在 Chrome (78.0.3904.108)、Edge、Safari、Qtweb 中没有?
- oracle - Oracle ORDS 更新列
- kubernetes - Kubernetes:节点未就绪
- swift - 如何管理多个通知和观察者
- ruby - 使用 google-api-ruby-client 将文本写入 google doc 文件
- php - 如何根据请求更新更新功能上的复选框值?
- java - 为什么在java中将浮点数转换为字符串和将字符串转换为浮点数不同
- sql - 如何在 Google Big Query 中将“全名”列拆分为单独的名字和姓氏列?
- asp.net - 拒绝访问路径“C:\inetpub\wwwroot\Kentico12_2\CMS\App_Data\CMSTemp”
- javascript - 我可以使用一个函数来改变 React 中的不同状态吗?