Группировать список файлов по получасовому интервалу в python - PullRequest
0 голосов
/ 07 февраля 2019

Я использую Python 2.7, у меня есть список файлов в моих папках, тысячи файлов выглядят так:

20180828-024308.dat
20180828-024434.dat
20180828-030335.dat
20180828-032114.dat
20180828-040041.dat
..........

Это годы, месяц, дата, часы, минуты и секунды

Я хотел бы сгруппировать все эти файлы в получасовой интервал (примечание: год, месяц и дни не меняются)

Я хотел бы получить что-то вроде этого:

1: [20180828-024308.dat,20180828-024434.dat]
2: [20180828-030335.dat,20180828-032114.dat]
3: [20180828-040041.dat,....]
.......

Я думаю, что список мне подходит, или, может быть, датафрейм.

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

сначала преобразуйте ваши данные в dict, затем присоедините соответствующую строку.

код:

d = ['20180828-024308.dat', '20180828-024434.dat', '20180828-030335.dat', '20180828-032114.dat', '20180828-040041.dat']

output = {}

for i in d:
    key = i.split('-')[0]
    key1 = i.split('-')[1]
    # print(output)
    if key in output:

        if key1[0:2] in output[key]:

            output[key][key1[0:2]].append(key1[2:])
        else:
            output[key][key1[0:2]] = [key1[2:]]
    else:
        output[key] = {}
        output[key][key1[0:2]] = [key1[2:]]

print(output)
# print("_".join("{}_{}".format(k, v) for k, v in output.items()))
main_output = []
for i in output.keys():
    temp = []
    for j in output[i].keys():
        # [s + mystring for s in mylist]
        temp.append([i + '-' + j + s for s in output[i][j]])
    main_output.extend(temp)

print(main_output)

ВЫХОД:

{'20180828': {'02': ['4308.dat', '4434.dat'], '03': ['0335.dat', '2114.dat'], '04': ['0041.dat']}}
[['20180828-024308.dat', '20180828-024434.dat'], ['20180828-030335.dat', '20180828-032114.dat'], ['20180828-040041.dat']]
0 голосов
/ 07 февраля 2019

От: - что я понимаю, если предположить, что ваш фрейм данных выглядит следующим образом:

print(df)

                 files
0  20180828-024308.dat
1  20180828-024434.dat
2  20180828-030335.dat
3  20180828-032114.dat
4  20180828-040041.dat

df['file_time']= pd.to_datetime(df['files'].str.split('.dat').str[0])
df.groupby([pd.Grouper(key='file_time',freq='1800s')])['files'].apply(list).reset_index()

Выходы:

            file_time                                       files
0 2018-08-28 02:30:00  [20180828-024308.dat, 20180828-024434.dat]
1 2018-08-28 03:00:00  [20180828-030335.dat, 20180828-032114.dat]
2 2018-08-28 03:30:00                                          []
3 2018-08-28 04:00:00                       [20180828-040041.dat]

Примечание. Поскольку в диапазоне 3 нет файла:30-4, следовательно, список пуст.

0 голосов
/ 07 февраля 2019

Я думаю, что вы можете достичь этого и с помощью базового программирования.Поэтому сначала загрузите все свои файлы с помощью библиотеки os, а затем используйте python, чтобы получить список файлов.Вот фрагмент того, что я пытаюсь сказать

import os

folderPath = '/somepath'
filesInFolder = os.listdir(folderPath)
mapOfsimmilarFiles = {}
keyForMaps = 0
for fileNames in sorted(filesInFoldeyr):
    timePartOfFile = fileNames.split('-')[-1].split('.dat')[0]
    hr = timePartOfFile[0:2]
    min = timePartOfFile[2:4]
    sec = timePartOfFile[4:]
    if len(mapOfsimmilarFiles.keys()) == 0:
        mapOfsimmilarFiles[hr+'_'+min] = [fileNames]
    else:
        minsPresentInMaps = mapOfsimmilarFiles.keys()
        hrPresent = [int(h.split('_')[0]) for h in mapOfsimmilarFiles]
        minPresent = [(h.split('_')[1]) for h in mapOfsimmilarFiles]
        for timeUsed in minsPresentInMaps:
            hrPresent = timeUsed.split('_')[0]
            minPresent = timeUsed.split('_')[1] 
            if abs(int(hrPresent)-int(hr)) == 1:
                if abs(int(minPresent)-int(min)) <=30:
                    mapOfsimmilarFiles[timeUsed].append(fileNames)
                else:
                    #same hr but not 30mins so add to map as a new entry
                    mapOfsimmilarFiles[hr+'_'+min] = [fileNames]
                break
        mapOfsimmilarFiles[hr+'_'+min] = [fileNames]            

Надеюсь, это должно помочь вам и направить вас в правильном направлении.

...