PostgreSQL Group by to create a new group whenever column value changes
This is more complicated, you need to find consecutive rows with the same reserved value first and assign a common group number to it. There are several ways to achieve this, the following is the easest one to understand by submitting the Derived Tables individually:

SELECT min(dt) AS from_date, max(dt) AS to_date, reserved
FROM 
 (
   select dt, reserved, 
      -- assign a number to al rows with the same value
      sum(flag) over (order by dt rows unbounded preceding) as grp
   from
     ( SELECT dt, reserved,
          -- assigns 1 whenever reserved changes
          case when lag(reserved) over (order by dt) = reserved
               then 0 -- value of the previous same as current
               else 1 -- different value
          end as flag
       from reservations
     ) as dt
  ) as dt
GROUP BY reserved, grp