Панды импортируют csv-файлы из папки, выбрав более старую дату изменения

#pandas #csv #time

#панды #csv #время

Вопрос:

У меня есть папка с сотыми файлами .csv. Я сканирую папку, извлекая файлы пути, а затем один за другим импортирую в цикле, чтобы получить в них определенные данные. Есть дубликаты, которые я хочу удалить, выбрав только самые старые файлы.

Даты создания и изменения не похожи на даты, которые я вижу в проводнике Windows 10, но вместо этого дата-которая одинакова для всех из них — напоминает последний корень/ вариант сервера. Почему я не могу увидеть Дату изменения? Без этого ключа я не смогу продолжить работу с кодом, как описано. Любая помощь приветствуется!

 import os, glob, time # use glob to get all the csv files in the folder  csv_files = glob.glob(os.path.join(path_input, format))  output = pd.DataFrame(csv_files)  output.rename(columns={output.columns[0]: "file path"}, inplace=True)  for i in range(0, len(output)):  output['Creation date'] = time.ctime(os.path.getctime(output['file path'][i])) # creation date  output['Modif. date'] = time.ctime(os.path.getmtime(output['file path'][i])) # modification date  

«Дата изменения» csv-файлов, которые мне нужно получить

И что я получаю, так это:

 file path Creation date Modif. date  0 S:ProductionVerspaningGrootverspaningMeetr... Mon Jul 19 15:21:19 2021 Mon Jul 19 15:21:19 2021 1 S:ProductionVerspaningGrootverspaningMeetr... Mon Jul 19 15:21:19 2021 Mon Jul 19 15:21:19 2021 2 S:ProductionVerspaningGrootverspaningMeetr... Mon Jul 19 15:21:19 2021 Mon Jul 19 15:21:19 2021  

Ответ №1:

довольно просто использовать pathlib панды

 import pandas as pd from pathlib import Path  trg_dir = 'path/to/your/dir'  df = pd.concat([pd.read_csv(d).assign(pth=d) for d in Path(trg_dir).glob('*.csv')])  

поскольку мы назначили Posix объект столбцу, мы можем получить доступ к его базовым атрибутам, таким как измененное время.

 df['modify_dt'] = df['pth'].apply(lambda   x : pd.Timestamp(x.stat().st_mtime,unit='s'),1)  

представьте, что у нас были следующие выходные данные


pth это ваш ключ к обману.

 A pth modify_dt 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 1 2 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 2 3 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 1 2 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 2 3 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 1 2 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 2 3 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 1 2 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 2 3 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 1 2 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 2 3 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 1 2 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224 2 3 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224   df.sort_values('modify_dt',ascending=False).drop_duplicates(subset='pth',keep='first')   A pth modify_dt 0 1 /home/umarh/test/file.csv 2021-11-30 22:19:36.764982224  

Комментарии:

1. Спасибо, Умар. H, я полагаю, вы имеете в виду «импортировать Pathlib как путь» во второй строке кода. Тем не менее, я получаю эту ошибку: «Ошибка типа: объект «модуль» не может быть вызван»

2. @GuillermoDC см. правка — извините, должно было быть from pathlib import Path

Ответ №2:

Как насчет того, чтобы просто повторить файлы как можно проще и для начала убедиться, что вы получите ожидаемые результаты?

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

 import os, glob  ctime = os.path.getctime mtime = os.path.getmtime size = os.path.getsize  path_input = '.' format = '*.csv'  csv_files = glob.glob(os.path.join(path_input, format))  print(f'File,C-Time,M-Time,Size (B)') for csvf in csv_files:   print(f'{csvf},{ctime(csvf):.2f},{mtime(csvf):.2f},{size(csvf)}')  

Я запускаю это в каталоге с 1000 файлами с почти одинаковым временем создания, и я вижу разницу всего в 1/100 секунды:

 | File | C-Time | M-Time | Size (B) | |-----------|---------------|---------------|----------| | ./545.csv | 1638252246.15 | 1638252246.15 | 89 | | ./223.csv | 1638252245.86 | 1638252245.86 | 89 | | ./237.csv | 1638252245.87 | 1638252245.87 | 89 | | ./551.csv | 1638252246.15 | 1638252246.15 | 89 | | ./579.csv | 1638252246.17 | 1638252246.17 | 89 | | ./586.csv | 1638252246.18 | 1638252246.18 | 89 | | ./592.csv | 1638252246.19 | 1638252246.19 | 89 | | ./747.csv | 1638252246.33 | 1638252246.33 | 89 | | ./753.csv | 1638252246.34 | 1638252246.34 | 89 | | ./784.csv | 1638252246.36 | 1638252246.36 | 89 |  

Комментарии:

1. Спасибо, Зак Янг! Это действительно сработало! Я добавил time.ctime (), чтобы преобразовать секунды в читаемую дату. Как вы сообщаете глобусу путь к папке? В данный момент читает текущую рабочую дирекцию.

2. Просто обновил эту часть кода, чтобы отразить ваши настройки.

3. Извините, я не видел os.pathjoin(‘.’, ‘*.csv’), понятно, как указать папку, в которой находятся файлы. Я могу распечатать время на экране, но не могу загрузить его в фрейм данных столбца, есть идея?