Python_寻找时间戳最接近的数据

时间戳最接近的数据

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)

最近邻计算

简单计算

参考

posted @ 2026-02-03 15:56  辰令  阅读(0)  评论(0)    收藏  举报