code: def add_time_variables(df, reindex = True):
      
      if not "datetime" in df.columns:
          log.error("field datetime not found in DataFrame")
          return False
      df["datetime"]             = pd.to_datetime(df["datetime"])
      df["month"]                = df["datetime"].dt.month
      df["month_name"]           = df["datetime"].dt.strftime("%B")
      df["weekday"]              = df["datetime"].dt.weekday
      df["weekday_name"]         = df["datetime"].dt.weekday_name
      df["time_through_day"]     = df["datetime"].map(
                                       lambda x: x - datetime.datetime.combine(
                                           x.date(),
                                           datetime.time()
                                       )
                                   )
      df["fraction_through_day"] = df["time_through_day"].map(
                                       lambda x: x / datetime.timedelta(hours = 24)
                                   )
      df["hour"]                 = df["datetime"].dt.hour
      df["hours_through_day"]    = df["fraction_through_day"] * 24
      df["days_through_week"]    = df.apply(
                                       lambda row: row["weekday"] + row["fraction_through_day"],
                                       axis = 1
                                   )
      df["days_through_year"]    = df["datetime"].dt.dayofyear
      df.index                   = df["datetime"]
      #del df["datetime"]
      return df
docs: Return a DataFrame with variables for weekday index, weekday name, timedelta
      through day, fraction through day, hours through day and days through week
      added, optionally with the index set to datetime and the variable `datetime`
      removed. It is assumed that the variable `datetime` exists.