Skip to content

Commit 435066d

Browse files
refactor(response): simplify time parsing (#160)
Co-authored-by: Matthias (~talfus-laddus) <83658582+matthiasschaub@users.noreply.github.com>
1 parent ebcd7ee commit 435066d

File tree

2 files changed

+21
-50
lines changed

2 files changed

+21
-50
lines changed

ohsome/response.py

Lines changed: 20 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ def _as_dataframe(self, multi_index=True):
6767
else:
6868
raise TypeError("This result type is not implemented.")
6969

70-
self._format_timestamp(result_df)
70+
time_columns = result_df.columns.intersection(
71+
["timestamp", "fromTimestamp", "toTimestamp"]
72+
)
73+
result_df[time_columns] = result_df[time_columns].apply(self._format_timestamp)
74+
7175
if multi_index:
7276
self._set_index(result_df, groupby_names)
7377

@@ -110,37 +114,17 @@ def _as_geodataframe(
110114
"This result type cannot be converted to a GeoPandas GeoDataFrame object."
111115
)
112116

113-
if "@validFrom" in features.columns:
114-
features["@validFrom"] = pd.to_datetime(
115-
features["@validFrom"].str.replace("Z", ""), format="ISO8601"
116-
)
117-
features["@validTo"] = pd.to_datetime(
118-
features["@validTo"].str.replace("Z", ""), format="ISO8601"
119-
)
120-
if multi_index:
121-
features = features.set_index(["@osmId", "@validFrom", "@validTo"])
122-
elif "@snapshotTimestamp" in features.columns:
123-
features["@snapshotTimestamp"] = pd.to_datetime(
124-
features["@snapshotTimestamp"].str.replace("Z", ""), format="ISO8601"
125-
)
126-
if multi_index:
127-
features = features.set_index(["@osmId", "@snapshotTimestamp"])
128-
elif (
129-
"timestamp" in features.columns and "groupByBoundaryId" in features.columns
130-
):
131-
features["timestamp"] = pd.to_datetime(
132-
features["timestamp"].str.replace("Z", ""), format="ISO8601"
133-
)
134-
if multi_index:
135-
features = features.set_index(["groupByBoundaryId", "timestamp"])
136-
elif "@timestamp" in features.columns:
137-
features["@timestamp"] = pd.to_datetime(
138-
features["@timestamp"].str.replace("Z", ""), format="ISO8601"
139-
)
140-
if multi_index:
141-
features = features.set_index(["@timestamp"])
142-
else:
143-
raise TypeError("This result type is not implemented.")
117+
time_columns = ["@validFrom", "@validTo", "@snapshotTimestamp", "@timestamp"]
118+
existing_time_columns = features.columns.intersection(time_columns)
119+
features[existing_time_columns] = features[existing_time_columns].apply(
120+
self._format_timestamp
121+
)
122+
123+
if multi_index:
124+
index_columns = features.columns.intersection(
125+
["@osmId"] + time_columns
126+
).to_list()
127+
features = features.set_index(index_columns)
144128

145129
return features.sort_index()
146130

@@ -192,20 +176,7 @@ def _create_groupby_dataframe(self, data, groupby_names) -> DataFrame:
192176
record_dfs.extend(record_result)
193177
return pd.DataFrame().from_records(record_dfs)
194178

195-
def _format_timestamp(self, result_df: DataFrame) -> None:
196-
"""
197-
Format timestamp column as datetime
198-
:param result_df:
199-
:return:
200-
"""
201-
if "timestamp" in result_df.columns:
202-
result_df["timestamp"] = pd.to_datetime(
203-
result_df["timestamp"].str.replace("Z", ""), format="ISO8601"
204-
)
205-
else:
206-
result_df["fromTimestamp"] = pd.to_datetime(
207-
result_df["fromTimestamp"].str.replace("Z", ""), format="ISO8601"
208-
)
209-
result_df["toTimestamp"] = pd.to_datetime(
210-
result_df["toTimestamp"].str.replace("Z", ""), format="ISO8601"
211-
)
179+
@staticmethod
180+
def _format_timestamp(dt: pd.Series) -> pd.Series:
181+
"""Format timestamp column as datetime."""
182+
return pd.to_datetime(dt.str.replace("Z", ""), format="ISO8601")

ohsome/test/test_response.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ def test_all_columns_with_timestamps_to_be_without_timezone(base_client):
443443
at_timestamp = (
444444
client.contributions.geometry.post(time=time2iso, bboxes=bbox, filter=fltr)
445445
.as_dataframe()
446-
.index[0]
446+
.index[0][1]
447447
)
448448
timestamp = (
449449
client.elements.count.groupByBoundary.post(bboxes=bbox, time=time, filter=fltr)

0 commit comments

Comments
 (0)