Масштабировать диапазон дат с помощью Python - PullRequest
3 голосов
/ 11 ноября 2019

Вот проблема:

У меня есть (большой) набор дат, охватывающий 200 лет между 2100 и 2300 гг., Например:

raw = [
    '2100-09-01',
    '2200-03-07',
    '2295-07-27'
]

(и т. Д. Около 1М дат) мне нужнопреобразовать даты в меньший (и более ранний, а также не кратный десяти) диапазон между 1988 и 2002 гг., например:

transformed = [
    '1988-09-01',
    '1998-03-08',
    '2001-08-01'
]

... так, чтобы исходное распределение значений по отношению к минимальному/ среднее / максимальное из исходного диапазона сохраняется, и даты действительны (то есть не 29 февраля в високосный год).

1 Ответ

3 голосов
/ 11 ноября 2019

Попробуйте использовать toordinal(). Порядковый номер 1 января 1 года нашей эры равен 1.

ordinals = [d.toordinal() for d in raw]

Теперь у вас есть список чисел, который легко масштабировать:

def scale_num(raw, target_max, target_min, source_max, source_min):
    scaled = (((raw - source_min)/(source_max - source_min))*(target_max - target_min))+target_min
    return scaled

target_min = datetime.datetime(1988,1,1).toordinal()
target_max = datetime.datetime(2001,12,31).toordinal()
source_max = max(ordinals)
source_min = min(ordinals)

scaled = [round(scale_num(d, target_max, target_min, source_max, source_min)) for d in ordinals]

Чтобы преобразовать порядковый номер вдата, используйте date.fromordinal():

date = date.fromordinal(1).isoformat()
...