Нечто подобное должно работать. Сначала мы линейно интерполируем между началом года и концом года, а затем форматируем вывод в формате ГГГГММДД в соответствии с запросом:
decimal_to_date = function(dt){
yr = floor(dt)
yr_begin = ISOdate(yr, 1, 1, 0, 0, 0)
yr_end = ISOdate(yr+1, 1, 1, 0, 0, 0)
interpolated_date = yr_begin + (yr_end - yr_begin) * (dt - yr)
return(format(interpolated_date, '%Y%m%d'))
}
Тогда, например, decimal_to_date(1990.12466)
возвращает 19900215
за 15 февраля 1990 г.
Если вы выводите время и даты, время дня всегда очень близко к полудню, что наводит на мысль о процессе, который сгенерировал ваши данные, хотя я не совсем уверен, что.