Source code for saferoad.utils
import re
import time
from datetime import datetime
from dateutil import parser as dsparser
from numpy import array as nparray
[docs]
def extract_dates(column_names: list[str]) -> tuple[list[str], list[datetime]]:
"""Extracts date fields from a list of column names.
:param column_names: List of column names to search for dates.
:type column_names: list[str]
:return: A tuple containing two numpy arrays: one with the column names and another with the parsed date objects.
:rtype: tuple[ndarray, ndarray]
"""
assert isinstance(column_names, list), "column_names must be a list of strings"
assert all(
isinstance(name, str) for name in column_names
), "All items in column_names must be strings"
assert len(column_names) > 0, "column_names must not be empty"
nameFields: list = []
dateFields: list = []
for date in column_names:
dateSearch = re.search(r"\d{8}", date)
if dateSearch:
pdate: datetime = dsparser.parse(dateSearch.group(), fuzzy=True).date()
dateFields.append(pdate)
nameFields.append(date)
return nameFields, dateFields
[docs]
def time_vector(dates: list[datetime]) -> nparray:
"""Generates a time vector in days from a list of datetime objects.
:param dates: List of datetime objects.
:type dates: list[datetime]
:return: List of time differences in days from the first date.
:rtype: list[float]
"""
return nparray([(i - dates[0]).days for i in dates])
[docs]
class Timer(object):
"""Context manager for timing code execution."""
def __init__(self, name=None):
self.name = name
def __enter__(self):
self.tstart = time.time()
def __exit__(self, type, value, traceback):
if self.name:
print("%s took %.2f seconds" % (self.name, time.time() - self.tstart))