Source code for convert2.parse_datetime
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import numpy as np
import pandas as pd
try:
from .pkg import rolex
except: # pragma: no cover
from convert2.pkg import rolex
[docs]class Anything2Datetime(object):
"""Parse anything to ``datetime.datetime``.
The logic:
- for int, it's the ``datetime.from_utctimestamp(value)``
- for float, it's the ``datetime.from_utctimestamp(value)``
- for str, try to parse ``datetime``
- for datetime type, it's itself
- for date type, it's the time at 00:00:00
"""
def __call__(self, value):
#--- None ---
if value is None:
return None
try:
if np.isnan(value):
return None
except:
pass
#--- int, long, np.int, np.int8, np.int16, np.int32, np.int64 ---
try:
if int(value) == value:
try:
return rolex.from_utctimestamp(int(value))
except:
raise ValueError("%r is not datetime parsable!" % value)
except:
pass
#--- float, np.float, np.float16, np.float32, np.float64 ---
if type(value).__name__.startswith("float"):
try:
return rolex.from_utctimestamp(float(value))
except:
raise ValueError("%r is not datetime parsable!" % value)
#--- np.datetime64, pd.Timestamp ---
if isinstance(value, pd.Timestamp):
try:
return value.to_pydatetime()
except:
raise ValueError("%r is not datetime parsable!" % value)
if isinstance(value, np.datetime64):
try:
return value.astype(datetime)
except:
raise ValueError("%r is not datetime parsable!" % value)
# --- other type ---
try:
return rolex.parse_datetime(value)
except:
raise ValueError("%r is not datetime parsable!" % value)
any2datetime = Anything2Datetime()