Skip to content

Commit b8cce79

Browse files
authored
Merge pull request #378 from informatics-lab/fix-timestamp-old-state
Fix timestamp old state
2 parents 9b9c281 + 0e53df8 commit b8cce79

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

forest/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
.. automodule:: forest.presets
2424
2525
"""
26-
__version__ = '0.17.1'
26+
__version__ = '0.17.2'
2727

2828
from .config import *
2929
from . import (

forest/db/control.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,20 @@ def time_array_equal(x, y):
118118
return False
119119
elif (len(x) == 0) or (len(y) == 0):
120120
return x == y
121+
else:
122+
if len(x) != len(y):
123+
return False
124+
left = _as_datetime_array(x)
125+
right = _as_datetime_array(y)
126+
return np.all(left == right)
127+
128+
def _as_datetime_array(x):
129+
"""Either vectorized _to_datetime or pd.to_datetime"""
121130
try:
122-
return np.all(_vto_datetime(x) == _vto_datetime(y))
131+
return _vto_datetime(x)
123132
except TypeError:
124133
# NOTE: Needed for EarthNetworks DatetimeIndex
125-
return np.all(pd.to_datetime(x) == pd.to_datetime(y))
134+
return pd.to_datetime(x)
126135

127136
def equal_value(a, b):
128137
if (a is None) and (b is None):

test/test_state.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import pytest
22
import datetime as dt
33
import numpy as np
4+
import pandas as pd
5+
import cftime
46
from forest import db
7+
from forest.db.control import time_array_equal
58

69

710
@pytest.mark.parametrize("left,right,expect", [
@@ -35,8 +38,50 @@
3538
(db.State(), db.State(variables=["a", "b"]), False),
3639
(db.State(variables=["a", "b"]), db.State(variables=["a", "b"]), True),
3740
(db.State(variables=np.array(["a", "b"])),
38-
db.State(variables=["a", "b"]), True),
41+
db.State(variables=["a", "b"]), True)
3942
])
4043
def test_equality_and_not_equality(left, right, expect):
4144
assert (left == right) == expect
4245
assert (left != right) == (not expect)
46+
47+
48+
def test_state_equality_valueerror_lengths_must_match():
49+
"""should return False if lengths do not match"""
50+
valid_times = (
51+
pd.date_range("2020-01-01", periods=2),
52+
pd.date_range("2020-01-01", periods=3),
53+
)
54+
left = db.State(valid_times=valid_times[0])
55+
right = db.State(valid_times=valid_times[1])
56+
assert (left == right) == False
57+
58+
59+
def test_time_array_equal():
60+
left = pd.date_range("2020-01-01", periods=2)
61+
right = pd.date_range("2020-01-01", periods=3)
62+
assert time_array_equal(left, right) == False
63+
64+
65+
def test_valueerror_lengths_must_match():
66+
a = ["2020-01-01T00:00:00Z"]
67+
b = ["2020-02-01T00:00:00Z", "2020-02-02T00:00:00Z", "2020-02-03T00:00:00Z"]
68+
with pytest.raises(ValueError):
69+
pd.to_datetime(a) == pd.to_datetime(b)
70+
71+
72+
@pytest.mark.parametrize("left,right,expect", [
73+
pytest.param([cftime.DatetimeGregorian(2020, 1, 1),
74+
cftime.DatetimeGregorian(2020, 1, 2),
75+
cftime.DatetimeGregorian(2020, 1, 3)],
76+
pd.date_range("2020-01-01", periods=3),
77+
True,
78+
id="gregorian/pandas same values"),
79+
pytest.param([cftime.DatetimeGregorian(2020, 2, 1),
80+
cftime.DatetimeGregorian(2020, 2, 2),
81+
cftime.DatetimeGregorian(2020, 2, 3)],
82+
pd.date_range("2020-01-01", periods=3),
83+
False,
84+
id="gregorian/pandas same length different values"),
85+
])
86+
def test_time_array_equal_mixed_types(left, right, expect):
87+
assert time_array_equal(left, right) == expect

0 commit comments

Comments
 (0)