遍历字典,查找重复项并在重复项之间进行插值

时间:2019-10-11 08:23:00

标签: python python-3.x

我得到了一个表,该表中有重复的时间和重复的位置,重复的次数在表中各不相同,但第一列中具有唯一的ffid值。我试图遍历表格,将相同的时间分组,然后从该组的第一次时间/位置到下一个位置插值。这是一个示例...

FFID    X   Y   YEAR    DAY HOUR    MINUTE  SECOND
2   585046.024  4368375.389 2019    277 18  38  37
3   585046.024  4368375.389 2019    277 18  38  37
4   585046.024  4368375.389 2019    277 18  38  37
5   585046.024  4368375.389 2019    277 18  38  37
6   585046.024  4368375.389 2019    277 18  38  37
7   585044.853  4368373.899 2019    277 18  38  38
8   585044.853  4368373.899 2019    277 18  38  38
9   585044.853  4368373.899 2019    277 18  38  38
10  585044.853  4368373.899 2019    277 18  38  38
11  585044.853  4368373.899 2019    277 18  38  38
12  585044.853  4368373.899 2019    277 18  38  38
13  585043.674  4368372.383 2019    277 18  38  39
14  585043.674  4368372.383 2019    277 18  38  39
15  585043.674  4368372.383 2019    277 18  38  39
16  585043.674  4368372.383 2019    277 18  38  39
17  585043.674  4368372.383 2019    277 18  38  39
18  585043.674  4368372.383 2019    277 18  38  39

我对python还是很陌生,对此我有些不了解。但是我将数据作为字典输入,将实体和时间分组为我的键,将XY位置分组为我的值。这样...

'1 279 2:47:50.0':['590867.803', '4388318.746']

我试图将这些项目分解为一个列表,并相互比较这些值,并在进行插值时重建字典。我的代码的开始...

#%% Sort list and interpolate across identical values
    x=0
    sbp_int = dict()
    rows = [s_ffid[0], s_jd[0], s_hr[0], s_mm[0], s_ss[0], s_X[0], s_Y[0]]
    for r in range(1,len(sbp_lst)):
        rows = [s_ffid[r], s_jd[r], s_hr[r], s_mm[r], s_ss[r], s_X[r], s_Y[r]]
        crnt= [item[r] for item in sbp_lst]
        prev= [item[r-1] for item in sbp_lst]
        if crnt[1:5] == prev[1:5]:
            temp = str(crnt[0])+' '+str(crnt[1])+' '+str(crnt[2])+':'+str(crnt[3])+':'+str(crnt[4])
            sbp_int[temp]=[crnt[5], crnt[6]]

但是我开始认为我正在以错误的方式来寻求建议。

我想要的结果看起来像这样...完全公开,我只是盯着插值,但是我想要的是线性插值。

FFID    X   Y   YEAR    DAY HOUR    MINUTE  SECOND
2   585046.024  4368375.389 2019    277 18  38  37
3   585045.774  4368375.489 2019    277 18  38  37
4   585045.524  4368375.589 2019    277 18  38  37
5   585045.274  4368375.689 2019    277 18  38  37
6   585045.024  4368375.789 2019    277 18  38  37
7   585044.853  4368373.899 2019    277 18  38  38

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我为您的问题提出了以下解决方案:

  1. 我生成一个defaultdict,以不同的日期作为键,以“ FFID”列表作为值
  2. 另一个以FFID为键的字典,相应的x,y点的元组为值。

使用这些,我遍历不同的日期,然后使用每个日期的FFID值的数量来确定步数,然后对每个x,y值简单地应用线性插值。

这是脚本:

import collections

input = """
FFID    X   Y   YEAR    DAY HOUR    MINUTE  SECOND
2   585046.024  4368375.389 2019    277 18  38  37
3   585046.024  4368375.389 2019    277 18  38  37
4   585046.024  4368375.389 2019    277 18  38  37
5   585046.024  4368375.389 2019    277 18  38  37
6   585046.024  4368375.389 2019    277 18  38  37
7   585044.853  4368373.899 2019    277 18  38  38
8   585044.853  4368373.899 2019    277 18  38  38
9   585044.853  4368373.899 2019    277 18  38  38
10  585044.853  4368373.899 2019    277 18  38  38
11  585044.853  4368373.899 2019    277 18  38  38
12  585044.853  4368373.899 2019    277 18  38  38
13  585043.674  4368372.383 2019    277 18  38  39
14  585043.674  4368372.383 2019    277 18  38  39
15  585043.674  4368372.383 2019    277 18  38  39
16  585043.674  4368372.383 2019    277 18  38  39
17  585043.674  4368372.383 2019    277 18  38  39
18  585043.674  4368372.383 2019    277 18  38  39
"""

FFID = slice(0, 2)
X = slice(4, 14)
Y = slice(16, 26)
DATE = slice(28, 50)
line_items = input.split('\n')[2:-1]

distinct_date = collections.defaultdict(list)
points_dict = {}

for item in line_items:
    distinct_date[item[DATE]].append(item[FFID])
    points_dict[item[FFID]] = (float(item[X]), float(item[Y]))

date_arr = [k for k in distinct_date.keys()]

for i in range(len(date_arr) - 1):
    x0, y0 = points_dict[distinct_date[date_arr[i]][0]]
    x1, y1 = points_dict[distinct_date[date_arr[i + 1]][0]]
    steps = range(len(distinct_date[date_arr[i]]))
    interpolated = [(step / len(steps) * (x1 - x0) + x0, step / len(steps) * (y1 - y0) + y1) for step in steps]
    for j in steps:
        ffid_val = distinct_date[date_arr[i]][j]
        print(f'{ffid_val}  {interpolated[j][0]:.3f}  {interpolated[j][1]:.3f}  {date_arr[i]}')

如果您需要更详细的说明,请告诉我。