时间戳最接近的数据
import os
from decimal import Decimal, getcontext
import bisect
def get_match_timestamp(target_time, candidates, match_gap=1):
match_time = None
work_context = getcontext()
work_context.prec = 2
for candit in candidates:
candit_time = Decimal(candit)
print("candit_time", candit_time)
target_time = Decimal(target_time)
time_gap = abs(target_time - candit_time)
if time_gap <= match_gap:
match_time = Decimal(candit_time)
match_gap = time_gap
if not match_time:
print("NO match time", target_time)
return match_time
def get_sililary_match_timestamp(target_time, candidates, match_gap=1):
match_time = None
for candit in candidates:
candit_time = candit
target_time = target_time
time_gap = abs(target_time - candit_time)
if time_gap <= match_gap:
match_time = candit_time
match_gap = time_gap
if not match_time:
print("NO match time", target_time)
return match_time
def find_match_closte(target_time, candidates, match_gap=100):
match_time = None
if not candidates:
match_time
target_time = float(target_time)
sorted_num_dat = sorted(candidates)
pos = bisect.bisect_left(sorted_num_dat, target_time)
candidate_dat = []
if pos > 0:
candidate_dat.append(sorted_num_dat[pos - 1])
if pos < len(sorted_num_dat):
candidate_dat.append(sorted_num_dat[pos])
print("#candidate_dat", candidate_dat, pos)
if candidate_dat:
closte_num = min(candidate_dat, key=lambda x: abs(x - target_time))
min_diff = abs(closte_num - target_time)
print("#closte_num ", closte_num, min_diff)
if min_diff <= match_gap:
match_time = closte_num
return match_time
### 浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了)
### 小数点最后一位是0 ,数据保留
## decimal模块提供了对浮点数的更精确控制,可以用来避免四舍五入的问题
if __name__ == "__main__":
target_ts = 2000.3456
cadidate_ts = [2002.3456, 2003.340, 2002.350, 2002.120, 2003]
cadidate_ts_str = ['2002.340', '2003.340', '2002.120', '2003']
info = [float(dat) for dat in cadidate_ts_str]
print(info)
result_deci = get_match_timestamp(target_ts, cadidate_ts)
result_dat = get_sililary_match_timestamp(target_ts, cadidate_ts)
print(result_dat, result_deci)
sorted_numeric = sorted(cadidate_ts)
all_dat = find_match_closte(target_ts, cadidate_ts)
print("all", all_dat)
最近邻计算
简单计算
参考