def METHOD_NAME(df: pd.DataFrame, plant_utc_offset: pd.DataFrame) -> pd.DataFrame:
    """Convert CEMS datetime data to UTC timezones.
    Transformations include:
    * Account for timezone differences with offset from UTC.
    Args:
        df: A CEMS hourly dataframe for one year-state.
        plant_utc_offset: A dataframe association with timezones.
    Returns:
        The same data, with an op_datetime_utc column added and the op_date and op_hour
        columns removed.
    """
    df = df.assign(
        # Convert op_date and op_hour from string and integer to datetime:
        # Note that doing this conversion, rather than reading the CSV with
        # `parse_dates=True`, is >10x faster.
        # Read the date as a datetime, so all the dates are midnight
        op_datetime_naive=lambda x: pd.to_datetime(
            x.op_date, format=r"%Y-%m-%d", exact=True, cache=True
        )
        + pd.to_timedelta(x.op_hour, unit="h")  # Add the hour
    ).merge(
        plant_utc_offset,
        how="left",
        on="plant_id_eia",
    )
    # Some of the timezones in the plants_entity_eia table may be missing,
    # but none of the CEMS plants should be.
    if df["utc_offset"].isna().any():
        missing_plants = df.loc[df["utc_offset"].isna(), "plant_id_eia"].unique()
        raise ValueError(
            f"utc_offset should never be missing for CEMS plants, but was "
            f"missing for these: {str(list(missing_plants))}"
        )
    # Add the offset from UTC. CEMS data don't have DST, so the offset is always the
    # same for a given plant. The result is a timezone naive datetime column that
    # contains values in UTC. Storing timezone info in Numpy datetime64 objects is
    # deprecated, but the PyArrow schema stores this data as UTC. See:
    # https://numpy.org/devdocs/reference/arrays.datetime.html#basic-datetimes
    df["operating_datetime_utc"] = df["op_datetime_naive"] - df["utc_offset"]
    del (
        df["op_date"],
        df["op_hour"],
        df["op_datetime_naive"],
        df["utc_offset"],
    )
    return df