Skip to content

Commit d34cf46

Browse files
committed
add time and date type transformations
1 parent 0ca8808 commit d34cf46

File tree

2 files changed

+111
-1
lines changed

2 files changed

+111
-1
lines changed

polytope_feature/datacube/transformations/datacube_type_change/datacube_type_change.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from copy import deepcopy
22
from importlib import import_module
3+
import pandas as pd
34

45
from ..datacube_transformations import DatacubeAxisTransformation
56

@@ -75,4 +76,46 @@ def make_str(self, value):
7576
return tuple(values)
7677

7778

78-
_type_to_datacube_type_change_lookup = {"int": "TypeChangeStrToInt"}
79+
class TypeChangeStrToTimestamp(DatacubeAxisTypeChange):
80+
def __init__(self, axis_name, new_type):
81+
self.axis_name = axis_name
82+
self._new_type = new_type
83+
84+
def transform_type(self, value):
85+
try:
86+
return pd.Timestamp(value)
87+
except ValueError:
88+
return None
89+
90+
def make_str(self, value):
91+
values = []
92+
for val in value:
93+
values.append(val.strftime('%Y%m%d'))
94+
return tuple(values)
95+
96+
97+
class TypeChangeStrToTimedelta(DatacubeAxisTypeChange):
98+
def __init__(self, axis_name, new_type):
99+
self.axis_name = axis_name
100+
self._new_type = new_type
101+
102+
def transform_type(self, value):
103+
try:
104+
hours = int(value[:2])
105+
mins = int(value[2:])
106+
return pd.Timedelta(hours=hours, minutes=mins)
107+
except ValueError:
108+
return None
109+
110+
def make_str(self, value):
111+
values = []
112+
for val in value:
113+
hours = int(val.total_seconds() // 3600)
114+
mins = int((val.total_seconds() % 3600) // 60)
115+
values.append(f"{hours:02d}{mins:02d}")
116+
return tuple(values)
117+
118+
119+
_type_to_datacube_type_change_lookup = {"int": "TypeChangeStrToInt",
120+
"date": "TypeChangeStrToTimestamp",
121+
"time": "TypeChangeStrToTimedelta"}

tests/test_date_time_unmerged.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import pandas as pd
2+
import pytest
3+
4+
from polytope_feature.polytope import Polytope, Request
5+
from polytope_feature.shapes import Box, Select
6+
7+
8+
class TestSlicingFDBDatacube:
9+
def setup_method(self, method):
10+
# Create a dataarray with 3 labelled axes using different index types
11+
self.options = {
12+
"axis_config": [
13+
{"axis_name": "step", "transformations": [{"name": "type_change", "type": "int"}]},
14+
{"axis_name": "date", "transformations": [{"name": "type_change", "type": "date"}]},
15+
{"axis_name": "time", "transformations": [{"name": "type_change", "type": "time"}]},
16+
{
17+
"axis_name": "values",
18+
"transformations": [
19+
{"name": "mapper", "type": "octahedral", "resolution": 1280, "axes": ["latitude", "longitude"]}
20+
],
21+
},
22+
{"axis_name": "latitude", "transformations": [{"name": "reverse", "is_reverse": True}]},
23+
{"axis_name": "longitude", "transformations": [{"name": "cyclic", "range": [0, 360]}]},
24+
],
25+
"pre_path": {"class": "od", "expver": "0001", "levtype": "sfc", "stream": "oper", "type": "fc"},
26+
"compressed_axes_config": [
27+
"longitude",
28+
"latitude",
29+
"levtype",
30+
"step",
31+
"date",
32+
"domain",
33+
"expver",
34+
"param",
35+
"class",
36+
"stream",
37+
"type",
38+
],
39+
}
40+
41+
# Testing different shapes
42+
@pytest.mark.fdb
43+
def test_fdb_datacube(self):
44+
import pygribjump as gj
45+
46+
request = Request(
47+
Select("step", [0]),
48+
Select("levtype", ["sfc"]),
49+
Select("date", [pd.Timestamp("20240118")]),
50+
Select("time", [pd.Timedelta("00:00:00")]),
51+
Select("domain", ["g"]),
52+
Select("expver", ["0001"]),
53+
Select("param", ["167"]),
54+
Select("class", ["od"]),
55+
Select("stream", ["oper"]),
56+
Select("type", ["fc"]),
57+
Box(["latitude", "longitude"], [0, 0], [0.2, 0.2]),
58+
)
59+
self.fdbdatacube = gj.GribJump()
60+
self.API = Polytope(
61+
datacube=self.fdbdatacube,
62+
options=self.options,
63+
)
64+
result = self.API.retrieve(request)
65+
result.pprint()
66+
assert len(result.leaves) == 3
67+
assert len(result.leaves[0].result) == 3

0 commit comments

Comments
 (0)