Create a sensor with the time with the highest forecasted temperature today

I would like to create a sensor that contains the time at which the forecasted temperature will be highest today.
I have created a time-triggered template as follows:

template:
  - trigger:
      - platform: time
        at: "0:01"
      - trigger: homeassistant
        event: start
      - platform: event
        event_type: event_template_reloaded
    action:
      action: weather.get_forecasts
      target:
        entity_id: weather.weer_weer
      data:
        type: hourly
      response_variable: voorspelling
    sensor:
      - name: "Highest Forecasted Temperature Time"
        unique_id: "highest_forecasted_temperature_time"
        device_class: timestamp
        state: >-
          {% set forecast = voorspelling["weather.weer_weer"].forecast %}
          {% set highest_temp = forecast | max(attribute='temperature') %}
          {% set highest_temp_data = forecast | selectattr('temperature', 'equalto', highest_temp.temperature) | first %}
          {{ strptime(highest_temp_data.datetime, '%Y-%m-%dT%H:%M:%S%z') }}

Unfortunately, this sensor sometimes contains a timestamp for tomorrow (because the sensor looks 24 hours in the future).
I tried to filter the forecasts using selectattr, but I cannot figure out how to compare the string contained in .datetime to an actual datetime object, so I can compare it with today’s date.

Then I tried to use a for loop to filter the forecast’s datetimes as follows:

{% set voorspelling = {"weather.weer_weer":{"forecast":[{"condition":"cloudy","precipitation_probability":12.4,"datetime":"2024-11-13T09:00:00+00:00","wind_bearing":285.8,"cloud_coverage":100,"uv_index":0.4,"temperature":9.4,"wind_gust_speed":13,"wind_speed":7.6,"precipitation":0,"humidity":91},{"condition":"cloudy","precipitation_probability":7.7,"datetime":"2024-11-13T10:00:00+00:00","wind_bearing":288.2,"cloud_coverage":100,"uv_index":0.7,"temperature":9.8,"wind_gust_speed":15.5,"wind_speed":9,"precipitation":0,"humidity":90},{"condition":"cloudy","precipitation_probability":6.7,"datetime":"2024-11-13T11:00:00+00:00","wind_bearing":300.3,"cloud_coverage":100,"uv_index":0.9,"temperature":10.3,"wind_gust_speed":16.9,"wind_speed":9.4,"precipitation":0,"humidity":90},{"condition":"cloudy","precipitation_probability":4.1,"datetime":"2024-11-13T12:00:00+00:00","wind_bearing":314.6,"cloud_coverage":100,"uv_index":0.8,"temperature":11.3,"wind_gust_speed":20.9,"wind_speed":11.9,"precipitation":0,"humidity":88},{"condition":"cloudy","precipitation_probability":0.1,"datetime":"2024-11-13T13:00:00+00:00","wind_bearing":322.2,"cloud_coverage":100,"uv_index":0.6,"temperature":11.6,"wind_gust_speed":25.6,"wind_speed":14.4,"precipitation":0,"humidity":85},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-13T14:00:00+00:00","wind_bearing":316.5,"cloud_coverage":100,"uv_index":0.3,"temperature":11.6,"wind_gust_speed":25.2,"wind_speed":13,"precipitation":0,"humidity":86},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-13T15:00:00+00:00","wind_bearing":316.6,"cloud_coverage":100,"uv_index":0.1,"temperature":11.5,"wind_gust_speed":22.7,"wind_speed":13,"precipitation":0,"humidity":86},{"condition":"cloudy","precipitation_probability":4.8,"datetime":"2024-11-13T16:00:00+00:00","wind_bearing":313.7,"cloud_coverage":100,"uv_index":0,"temperature":11.2,"wind_gust_speed":22.7,"wind_speed":12.6,"precipitation":0,"humidity":87},{"condition":"cloudy","precipitation_probability":9.7,"datetime":"2024-11-13T17:00:00+00:00","wind_bearing":305.8,"cloud_coverage":99.8,"uv_index":0,"temperature":11,"wind_gust_speed":22,"wind_speed":12.2,"precipitation":0,"humidity":87},{"condition":"cloudy","precipitation_probability":22.7,"datetime":"2024-11-13T18:00:00+00:00","wind_bearing":294.3,"cloud_coverage":95.1,"uv_index":0,"temperature":10.7,"wind_gust_speed":20.9,"wind_speed":10.8,"precipitation":0,"humidity":89},{"condition":"cloudy","precipitation_probability":23.4,"datetime":"2024-11-13T19:00:00+00:00","wind_bearing":290.2,"cloud_coverage":99.9,"uv_index":0,"temperature":10.4,"wind_gust_speed":20.2,"wind_speed":11.9,"precipitation":0,"humidity":91},{"condition":"cloudy","precipitation_probability":22.1,"datetime":"2024-11-13T20:00:00+00:00","wind_bearing":283,"cloud_coverage":100,"uv_index":0,"temperature":10.5,"wind_gust_speed":20.5,"wind_speed":11.5,"precipitation":0,"humidity":94},{"condition":"cloudy","precipitation_probability":22.5,"datetime":"2024-11-13T21:00:00+00:00","wind_bearing":281.9,"cloud_coverage":100,"uv_index":0,"temperature":10.8,"wind_gust_speed":20.2,"wind_speed":11.9,"precipitation":0,"humidity":96},{"condition":"cloudy","precipitation_probability":12.2,"datetime":"2024-11-13T22:00:00+00:00","wind_bearing":302,"cloud_coverage":99.8,"uv_index":0,"temperature":11.2,"wind_gust_speed":20.5,"wind_speed":10.8,"precipitation":0,"humidity":98},{"condition":"cloudy","precipitation_probability":0.8,"datetime":"2024-11-13T23:00:00+00:00","wind_bearing":322.4,"cloud_coverage":99.5,"uv_index":0,"temperature":11.7,"wind_gust_speed":22.7,"wind_speed":13.3,"precipitation":0,"humidity":96},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-14T00:00:00+00:00","wind_bearing":336,"cloud_coverage":99.7,"uv_index":0,"temperature":11.4,"wind_gust_speed":24.5,"wind_speed":12.6,"precipitation":0,"humidity":94},{"condition":"cloudy","precipitation_probability":7.1,"datetime":"2024-11-14T01:00:00+00:00","wind_bearing":324.6,"cloud_coverage":100,"uv_index":0,"temperature":11.2,"wind_gust_speed":22.3,"wind_speed":11.5,"precipitation":0,"humidity":90},{"condition":"cloudy","precipitation_probability":10.9,"datetime":"2024-11-14T02:00:00+00:00","wind_bearing":322,"cloud_coverage":100,"uv_index":0,"temperature":11,"wind_gust_speed":23.8,"wind_speed":13.3,"precipitation":0,"humidity":90},{"condition":"cloudy","precipitation_probability":8.4,"datetime":"2024-11-14T03:00:00+00:00","wind_bearing":321,"cloud_coverage":94.2,"uv_index":0,"temperature":10.8,"wind_gust_speed":24.1,"wind_speed":13.3,"precipitation":0,"humidity":89},{"condition":"cloudy","precipitation_probability":2.9,"datetime":"2024-11-14T04:00:00+00:00","wind_bearing":325.7,"cloud_coverage":89.7,"uv_index":0,"temperature":10.3,"wind_gust_speed":22.7,"wind_speed":12.2,"precipitation":0,"humidity":86},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-14T05:00:00+00:00","wind_bearing":316.3,"cloud_coverage":98.4,"uv_index":0,"temperature":10.1,"wind_gust_speed":20.9,"wind_speed":10.8,"precipitation":0,"humidity":87},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-14T06:00:00+00:00","wind_bearing":307.5,"cloud_coverage":99.4,"uv_index":0,"temperature":10,"wind_gust_speed":19.8,"wind_speed":9,"precipitation":0,"humidity":84},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-14T07:00:00+00:00","wind_bearing":302.4,"cloud_coverage":99.8,"uv_index":0,"temperature":9.9,"wind_gust_speed":15.5,"wind_speed":6.5,"precipitation":0,"humidity":88},{"condition":"cloudy","precipitation_probability":0,"datetime":"2024-11-14T08:00:00+00:00","wind_bearing":322.3,"cloud_coverage":99.9,"uv_index":0.2,"temperature":10,"wind_gust_speed":19.4,"wind_speed":11.2,"precipitation":0,"humidity":86}]}} %}


{% set forecast = voorspelling["weather.weer_weer"].forecast %}

{% set forecasts = [] %}
{% for fitem in forecast %}
{% if as_datetime(fitem.datetime) < today_at("23:59") %}
{% set forecasts = forecasts + [fitem] %}
{% endif %}
{% endfor %}

{{ forecasts }}

However, this always returns an empty list.

I don’t longer know what to do, could you please point me towards my mistake?

Assuming the forecast datetime is an ISO-format string, then:

|selectattr('datetime','<=',today_at("23:59:59").isoformat())

…because you can do string comparisons on properly-ordered identical-format timestamps.

That’s because you need to use a namespace to update a variable in a for loop. Without checking if the rest of your code is good:

{% set ns = namespace(forecasts=[]) %}
{% for fitem in forecast %}
  {% if as_datetime(fitem.datetime) < today_at("23:59") %}
    {% set ns.forecasts = ns.forecasts + [fitem] %}
  {% endif %}
{% endfor %}

{{ ns.forecasts }}

Thank you very much for your answer!
I tried the selectattr statement and that did what I wanted, except that I needed to also add | list to prevent the output being <generator object select_or_reject for that variable.