首页 > 解决方案 > 使用 Python 缩放日期范围

问题描述

这是问题所在:

我有一组(大)日期,时间跨度为公元 2100 年到 2300 年之间的 200 年,例如:

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

(等大约 100 万个日期)我需要将日期转换为 1988 年到 2002 年之间的更小(更早,也不是十的倍数)范围,例如:

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

...这样就保留了原始范围的最小值/平均值/最大值的原始值分布,并且日期有效(即非闰年的 2 月 29 日)。

标签: pythonalgorithmdatetimetimerange

解决方案


尝试使用toordinal(). 公元 1 年 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()

推荐阅读