遍历字典,查找重复条目并跨重复项进行插值



我得到了一个表格,其中有重复的时间和重复的位置,这些位置在表格中重复变化,但在第一列中具有唯一的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 很陌生,对这个有点不了解。但是我已经将数据作为字典,其中ffid和时间分组为我的键,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. 我生成一个默认命令,以不同的日期作为键,将"FFID"列表作为值
  2. 另一个以 FFID 作为键和相应的 x、y 点元组作为值的字典。

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

这是脚本:

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]}')

如果您需要更详细的解释,请告诉我。

最新更新