我得到了一个表,该表中有重复的时间和重复的位置,重复的次数在表中各不相同,但第一列中具有唯一的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
预先感谢您的帮助!
答案 0 :(得分:1)
我为您的问题提出了以下解决方案:
使用这些,我遍历不同的日期,然后使用每个日期的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]}')
如果您需要更详细的说明,请告诉我。