我得到了一个表格,其中有重复的时间和重复的位置,这些位置在表格中重复变化,但在第一列中具有唯一的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
提前感谢您的帮助!
我想出了以下解决方案来解决您的问题:
- 我生成一个默认命令,以不同的日期作为键,将"FFID"列表作为值
- 另一个以 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]}')
如果您需要更详细的解释,请告诉我。