Ensures data is Zenobase compatible and patches it if possible,
        if cleaning is not possible it'll raise an appropriate exception

def clean_data(self):
        """Ensures data is Zenobase compatible and patches it if possible,
        if cleaning is not possible it'll raise an appropriate exception"""

        # TODO: Do the same for duration/timedelta
        if "timestamp" in self:
            self._check_timestamp()
            if type(self["timestamp"]) == list:
                def datetime_to_string(dt):
                    return fmt_datetime(dt) if type(dt) == datetime else dt
                self["timestamp"] = list(map(datetime_to_string, self["timestamp"]))
            elif type(self["timestamp"]) == datetime:
                self["timestamp"] = fmt_datetime(self["timestamp"])

        # FIXME: Support list of volumes
        if "volume" in self:
            self["volume"]["unit"] = self["volume"]["unit"].replace("l", "L")

        # FIXME: Support list of weights
        if "weight" in self:
            # Zenobase uses "ug" for micrograms
            if self["weight"]["unit"] in ["mcg", "µg"]:
                self["weight"]["unit"] = "ug"