Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python缩放日期范围_Python_Algorithm_Datetime_Time_Range - Fatal编程技术网

使用Python缩放日期范围

使用Python缩放日期范围,python,algorithm,datetime,time,range,Python,Algorithm,Datetime,Time,Range,问题是: 我有一组(大)日期,跨越公元2100年到2300年之间的200年,如: raw = [ '2100-09-01', '2200-03-07', '2295-07-27' ] (等约100万次) 我需要将日期转换为1988年到2002年之间的较小范围(更早,也不是10的倍数),如: transformed = [ '1988-09-01', '1998-03-08', '2001-08-01' ] …这样,相对于原始范围的最小值/平均值

问题是:

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

raw = [
    '2100-09-01',
    '2200-03-07',
    '2295-07-27'
]
(等约100万次) 我需要将日期转换为1988年到2002年之间的较小范围(更早,也不是10的倍数),如:

transformed = [
    '1988-09-01',
    '1998-03-08',
    '2001-08-01'
]
…这样,相对于原始范围的最小值/平均值/最大值的原始值分布被保留,并且日期是有效的(即非闰年不是2月29日)。

尝试使用。公元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()