Нужно выполнить математику на каждой строке в нескольких файлах CSV в Python
Вопрос
У меня есть около 100 файлов CSV, на которых я должен работать раз в месяц, и я пытался обернуть голову вокруг этого, но я сталкиваюсь с стеной. Я начинаю понимать некоторые вещи о Python, но сочетание нескольких вещей все еще дает мне проблемы, поэтому я не могу понять это.
Вот моя проблема:
У меня много файлов CSV, и вот что мне нужно сделать:
Добавьте «столбец» в переднюю часть каждого ряда (или заднюю часть, не имеет значения, но фронт идеален). Кроме того, каждая строка имеет 5 строк (не подсчитывает имя файла, которое будет добавлено), и вот формат:
6-значный идентификационный номер, yyyy-mm-dd (1), yyyy-mm-dd (2), yyyy-mm-dd (3), 1-2-значный номер
Мне нужно вычесть yyyy-mm-dd (3) из yyyy-mm-dd (2) для каждой строки в файле (нет строки заголовка), для каждого CSV в данном каталоге.
Мне нужно имя файла в строке, потому что я объединю файлы (которые, если включены в скрипт, было бы потрясающим, но я думаю, что смогу выяснить эту часть), и мне нужно знать, из какого файла пришли записи. Формат имени файла всегда '4-5-значный Number.csv'
Я надеюсь, что это имеет смысл, если это не так, пожалуйста, дайте мне знать. Я немного озадачен тем, с чего начать, поэтому у меня нет примера кода, который даже начал работать для меня. Действительно разочарован, поэтому я ценю любую помощь, которую вы можете предоставить, ребята, этот сайт качает!
Милан
Решение
В стандартной библиотеке есть инструмент для каждой из этих задач:
Для итерации по всем файлам CSV в каталоге используйте glob
модуль:
import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
#do_something
Для анализа файла CSV используйте csv
модуль:
import csv
with open(csvfilename, "rb") as csvfile:
reader = csv.reader(csvfile, delimiter=",")
for row in reader:
# row is a list of all the entries in the current row
Чтобы проанализировать дату и рассчитать разницу, используйте datetime
модуль:
from datetime import datetime
startdate = datetime.strptime("1999-10-20", "%Y-%m-%d")
enddate = datetime.strptime("2003-02-28", "%Y-%m-%d")
delta = enddate - startdate # difference in days
Чтобы добавить значение в начало ряда:
row[0:0] = [str(delta)]
Чтобы добавить имя файла к концу ряда:
row.append(csvfilename)
И написать строку в новый файл CSV:
with open(csvfilename, "wb") as csvfile:
writer = csv.writer(csvfile, delimiter=",")
writer.writerow(row)
Взяли все вместе, вы получаете:
import glob
import csv
from datetime import datetime
with open("combined_files_csv", "wb") as outfile:
writer = csv.writer(outfile, delimiter=",")
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
with open(csvfilename, "rb") as infile:
reader = csv.reader(infile, delimiter=",")
for row in reader:
startdate = datetime.strptime(row[3], "%Y-%m-%d")
enddate = datetime.strptime(row[2], "%Y-%m-%d")
delta = enddate - startdate # difference in days
row[0:0] = [str(delta)]
row.append(csvfilename)
writer.writerow(row)
Другие советы
Основной план программы будет таким:
- Используйте модуль ОС, чтобы вывести имена файлов из каталога/каталогов, представляющих интерес
- Читать в каждом файле по одному
- Для каждой строки в файле разделите его на столбцы с
columns = line.split(",")
- Используйте DateTime.Date для преобразования строк, таких как «2011-05-03» в DateTime.Dates.
- Вычтите третью дату со второй, которая дает DateTime.timedelta.
- Поместите всю свою информацию в желаемый формат (подсказка: str (foo) дает строковое представление Foo, практически для любого типа) и помните его на потом
- Закройте свой файл, откройте его для написания и напишите свои новые вещи в