使用Python缩放日期范围
问题是: 我有一组(大)日期,跨越公元2100年到2300年之间的200年,如:使用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' ] …这样,相对于原始范围的最小值/平均值
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()