Skip to content

Commit 4dc1dae

Browse files
committed
handle more types of arrays of times
1 parent ebf33ab commit 4dc1dae

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

pymap3d/timeconv.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,19 @@ def str2dt(time: datetime) -> np.ndarray:
1414
return time
1515
elif isinstance(time, str):
1616
return parse(time)
17+
elif isinstance(time, np.datetime64):
18+
return time.astype(datetime)
1719
else: # some sort of iterable
1820
try:
19-
return [parse(t) for t in time]
20-
except TypeError:
21-
return time.values.astype('datetime64[us]').astype(datetime)
21+
if isinstance(time[0], datetime):
22+
return time
23+
elif isinstance(time[0], np.datetime64):
24+
return time.astype(datetime)
25+
elif isinstance(time[0], str):
26+
return [parse(t) for t in time]
27+
except (IndexError, TypeError):
28+
pass
29+
30+
# last resort--assume pandas/xarray
31+
32+
return time.values.astype('datetime64[us]').astype(datetime)

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = pymap3d
3-
version = 1.7.10
3+
version = 1.7.10.1
44
author = Michael Hirsch, Ph.D.
55
author_email = [email protected]
66
description = pure Python coordinate conversions, following convention of several popular Matlab routines.

tests/test_time.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,51 @@
22
import pytest
33
from pymap3d.timeconv import str2dt
44
from datetime import datetime
5+
import numpy as np
56

67
t0 = datetime(2014, 4, 6, 8)
78

89

9-
def test_str2dt():
10+
def test_types():
1011
assert str2dt(t0) == t0 # passthrough
1112
assert str2dt('2014-04-06T08:00:00') == t0
1213
ti = [str2dt('2014-04-06T08:00:00'), str2dt('2014-04-06T08:01:02')]
1314
to = [t0, datetime(2014, 4, 6, 8, 1, 2)]
1415
assert ti == to # even though ti is numpy array of datetime and to is list of datetime
1516

17+
t1 = [t0, t0]
18+
assert (np.asarray(str2dt(t1)) == t0).all()
19+
20+
21+
def test_datetime64():
22+
t1 = np.datetime64(t0)
23+
assert str2dt(t1) == t0
24+
25+
t1 = np.array([np.datetime64(t0), np.datetime64(t0)])
26+
assert (str2dt(t1) == t0).all()
27+
1628

1729
def test_xarray_time():
1830
xarray = pytest.importorskip('xarray')
1931

2032
t = {'time': t0}
21-
2233
ds = xarray.Dataset(t)
2334
assert str2dt(ds['time']) == t0
2435

36+
t2 = {'time': [t0, t0]}
37+
ds = xarray.Dataset(t2)
38+
assert (str2dt(ds['time']) == t0).all()
39+
2540

2641
def test_pandas_time():
2742
pandas = pytest.importorskip('pandas')
2843

2944
t = pandas.Series(t0)
30-
assert str2dt(t) == t0
45+
assert (str2dt(t) == t0).all()
46+
47+
t = pandas.Series([t0, t0])
48+
assert (str2dt(t) == t0).all()
3149

3250

3351
if __name__ == '__main__':
34-
pytest.main([__file__])
52+
pytest.main(['-x', __file__])

0 commit comments

Comments
 (0)