Because the code explicitly puts it there:
pos = sprintf(buf, " %02d:%02d:%02d ",
realtime->tm_hour, realtime->tm_min, realtime->tm_sec);
uptime executable from the
procps package (on e.g. Ubuntu) calls a function called
print_uptime(). This function lives in
proc/whattime.c in the
procps sources. The function just outputs a string built by
sprint_uptime() in the same C source file which constructs the output string bit by bit.
The first bit that is added to the string is added with an initial space, as shown above.
The space has been there since at least 2002 in the
procps implementation of
uptime -p does not output a space:
$ uptime -p
up 8 weeks, 8 hours, 41 minutes
$ uptime --version
uptime from procps-ng 3.3.12
As noted by maxxvw, the GNU coreutils version of the utility uses a similar kind of output.
uptime utility on BSD systems does not follow the same output format:
11:56PM up 23:58, 1 user, load averages: 0.04, 0.02, 0.00