i think i see what may be going on, at least in some of these cases. looking at what the API returns, it looks like the observed_on_string field on some of these observations is not valid. for example, in the observation 4025819 (see https://api.inaturalist.org/v1/observations?id=4025819), the observed_on_string field = "3 septiembre ", which is invalid (no year, no time). if you look at when it was last updated, updated_at = “2019-05-16T11:07:19-05:00”, and the observed_on field (not the observed_on_string field) = “2019-05-16”. so i think what’s happening is because the observed_on_string field is bad, the system sets the observed_on date to the date of the last update (which i assume means any ID or annotation, etc.), and the time becomes 12AM, adjusted for the time zone.
so if you see an observation with a funny timestamp, and the timestamp has a time that is a whole hour (no minutes, no seconds), and if the timestamp changes if you update the observation, then i bet that’s what’s going on.
for observations that don’t follow this pattern, there’s probably something else going on… maybe the observer is manually changing stuff. for example, in the susanhewitt example (https://api.inaturalist.org/v1/observations?id=4591787), the observation also has a bad observed_on_string value, so maybe she saw that the date was wrong at some point, and she updated it, but updated it to the wrong year?
EDIT: maybe the susanhewitt observation is still a case of the system incorrectly interpreting date/time strings. see my test case below. i wonder if in her “Thu Nov 17 2016, afternoon” string, the system might not be recognizing “2016,” as a valid year and just setting it to the current year at the time of the last update (2018)? UPDATE: yup: i updated this observation (https://www.inaturalist.org/observations/21587563) with susanhewitt’s string, and the system translated that to “Nov 17, 2018 · 8:16 PM CST”, which is similar to her observed date/time, except different time zone.