2016-10-26 9 views
0

Я проанализировал текстовый файл, потянув соответствующие данные. Затем я объединил переменные (dlOrbit2, imageId3, imageStart4, imageEnd4) вместе, чтобы создать серию из 4 строк в списке.сопоставление, а затем группировка элементов списка

combined = str(','.join([dlOrbit2, imageId3, imageStart4, imageEnd4])) 
strSplit = combined.split(',') 

печати strSplit

['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'] 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'] 
['46290', '514628', '2016-10-26 13:12:54', '2016-10-26 13:13:13'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 

Я хотел бы матч и группы элементов в первом столбце. Итак, 46284 x 4, 46288 x 6, 46290 x 2, 46291 x 4. В этих группах я хотел бы иметь самое раннее время от элемента 2 и самое последнее время от элемента 3. Желаемый выход будет:

['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'] 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:54:57'] 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:13:13'] 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 

Этот список всегда будет 4 элемента, однако # элементов группировки (первый столбец) всегда будет меняться.

Я собираюсь экспортировать эти результаты в файл CSV. Однако мне нужна помощь только в этом разделе.

+0

Вы пытались что-либо сделать? не могли бы вы показать нам, как далеко вы ушли? – HuStmpHrrr

+0

@HuStmpHrrr Я пробовал в течение нескольких дней, я просто продолжаю крутиться в кругах. Я действительно не знаю следующего шага. Я попытался вставить словарь, попытался сравнить и добавить. –

+0

да, просто покажите нам код, и мы увидим, что пошло не так. – HuStmpHrrr

ответ

1

Использование pandas:

import pandas as pd 

dat = [['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'], 
['46290', '514629', '2016-10-26 13:12:54', '2016-10-26 13:13:13'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06']] 

df = pd.DataFrame(dat).drop_duplicates() 
df_times = df.groupby([0]).agg({2:min,3:max}).reset_index() 
df_times.merge(df,on=[0,2])[[0,1,2,'3_x']] 

Выход:

0 46284 514607 2016-10-26 02:43:46 2016-10-26 02:48:39 
1 46288 514626 2016-10-26 09:48:26 2016-10-26 09:54:57 
2 46290 514628 2016-10-26 13:12:34 2016-10-26 13:13:13 
3 46291 514738 2016-10-26 14:56:39 2016-10-26 14:59:06 
+0

Это приятное решение, хотя все имя столбца и материал заказа немного хрупкие. Обратите внимание: pandas также упростит сохранение csv с помощью 'DataFrame.to_csv()'. – ohruunuruus

0

Вы могли бы использовать на groupby и tee:

data = [ 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
    ['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], 
    ['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'], 
    ['46290', '514629', '2016-10-26 13:12:54', '2016-10-26 13:13:13'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], 
    ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'] 
] 


from itertools import groupby, tee 
import pprint 

res = [] 
for k, g in groupby(data, key=lambda x: x[0]): 
    it1, it2, it3 = tee(g, 3) 
    res.append(next(it1)[:2] + [min(x[2] for x in it2), max(x[3] for x in it3)]) 

pprint.pprint(res) 

Выход:

[['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], 
['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:54:57'], 
['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:13:13'], 
['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06']] 

for k, g in groupby(data, key=lambda x: x[0]) будет группировать последовательные строки на основе первого столбца. Он вернет кортежи, где первый элемент - это ключ, используемый для группировки, а второй - итератор над элементами группы.

it1, it2, it3 = tee(g, 3) разделит итератор группы на три итератора, из которых каждый вернет точно те же элементы. Наконец, результат строится, беря первые два столбца из первого сгруппированного элемента и запуская min & max над двумя другими итераторами.

1

Как новичок в Python, я хотел бы увидеть примеры с базовыми функциями python перед использованием Big Hammers.

Если это можно сделать без импорта модулей в менее чем дюжине строк кода, я бы ожидал узнать, что 1-й.

Возможно, манипулирование списками списков с двойной индексацией не был понят?

combined = [['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46284', '514607', '2016-10-26 02:43:46', '2016-10-26 02:48:39'], ['46288', '514626', '2016-10-26 09:48:26', '2016-10-26 09:48:37'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46288', '514663', '2016-10-26 09:53:46', '2016-10-26 09:54:57'], ['46290', '514628', '2016-10-26 13:12:34', '2016-10-26 13:12:53'], ['46290', '514629', '2016-10-26 13:12:54', '2016-10-26 13:13:13'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06'], ['46291', '514738', '2016-10-26 14:56:39', '2016-10-26 14:59:06']] 

combined[0][0] # double index 
Out[28]: '46284' 

combined[2][2:] # slice 
Out[29]: ['2016-10-26 02:43:46', '2016-10-26 02:48:39'] 

max(combined[2][2:]) # duck type order comparison 
Out[30]: '2016-10-26 02:48:39' 

и почему бы не определить функцию, чтобы использовать эти базовые инструменты Python во входных списках перед группировкой?