Проблема с чтением и объединением нескольких еженедельных файлов csv

133
17

Таким образом, у меня есть несколько лет еженедельных файлов CSV, которые выглядят так: в форме YYmmdd:

file = 'C:\\rig-070103'

Я пытаюсь читать и объединять их в один набор данных, предпочтительно в диапазоне дат. Пока у меня есть:

pieces = []

for date in range(100):
path = 'C:\\rig-YYmmdd.csv' % date
frame = pd.read_csv(path)
#frame['Date']= date
pieces.append(frame)
dataset = pd.concat(pieces, ignore_index=True)
print(dataset)

But this is giving me the error:
path = 'C:\\rig-YYmmdd.csv' % date
TypeError: not all arguments converted during string formatting

Я знаю, что это связано с тем, как я ссылаюсь на каждый файл, какие-либо предложения? Я также хотел бы создать еще один столбец с указанием даты для каждого загруженного файла, поэтому для каждого файла повторяется одна дата за все строки. Любая помощь в этом действительно ценится!

Вот пример данных:

Prov    Location    LSD Section Township    Range   Meridian ...
AB 00-00-006-29W4 0 0 6 29 4
AB 01-18-008-09W4 1 18 8 9 4
AB 05-10-008-10W4 5 10 8 10 4
AB 01-12-008-12W4 1 12 8 12 4
AB 09-23-008-26W4 9 23 8 26 4
AB 13-13-009-25W4 13 13 9 25 4

спросил(а) 2021-01-25T15:01:19+03:00 4 месяца, 4 недели назад
1
Решение
63

Пара вещей, которые здесь происходят:

Во-первых, for date in range(100) будет выполняться итерация через целые числа от 0 до 99. Нет нигде, где бы вы ни находились.

Далее, path = 'C:\\rig-YYmmdd.csv' % date недействителен. Предполагая, что у вас есть объект datetime, вы должны: path = 'C:\\rig-%s.csv' % date.strftime('%y%m%d')


Наконец, вы пишете/переписываете свою фреймворк с каждой итерацией. Это глупо.

Таким образом, ваш код становится

import pandas
pieces = []
columns = ['Prov', 'Objective', 'WellStatus', 'WellType']

for date in pandas.date_range('2012-01-01', periods=100):
path = r'C:\rig-%s.csv' % date.strftime('%y%m%d')
frame = pandas.read_csv(path, names=columns, encoding='utf-8')
frame['date'] = date
pieces.append(frame)

dataset = pandas.concat(pieces, ignore_index=True)
print(dataset)

ответил(а) 2021-01-25T15:01:19+03:00 4 месяца, 4 недели назад
62

Итак, есть несколько вещей, которые вы здесь делаете. Один из них - вам нужен диапазон дат, в котором каждый элемент является днем. Этот день должен быть отформатирован как yymmdd. Затем вы втягиваете csv в dataframe. Затем добавьте купон на дату. Затем добавьте это к основному фреймворку. Вот попытка:

import pandas as pd

myDateList = pd.date_range('2003-01-01', periods=100)

myBigDf = pd.DataFrame()

for date in myDateList:
path = 'C:\\rig-' + date.strftime('%y%m%d') + '.csv'
print path # show you what you got
piece = pd.read_csv(path)
piece['fileDate'] = date.strftime('%y%m%d')
myBigDf.append(piece, ignore_index=True)

ответил(а) 2021-01-25T15:01:19+03:00 4 месяца, 4 недели назад
45

Как показывает трассировка, это не правильный способ использования оператора modulo в строках. Вы можете использовать этот учебник (https://docs.python.org/2.4/lib/typesseq-strings.html), чтобы узнать, как он используется.

Чтобы получить строку в формате yymmdd определенной даты, вы можете использовать модуль datetime (https://docs.python.org/2/library/datetime.html) и функцию "strftime" для datetime.date следующим образом:

from datetime import date 
d = date(2007, 1, 13)
filename = d.strftime("C://rig-%y%m%d.csv")
#filename will be "C://rig-070113.csv"

Если вы хотите итерацию более 100 последовательных дней, вы должны использовать datetime.timedelta:

from datetime import date, timedelta
one_day = timedelta(1)
act_day = date(2007, 1, 13)
for i in range(100):
filename = act_day.strftime("C://rig-%y%m%d.csv")
...
act_day += one_day

ответил(а) 2021-01-25T15:01:19+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема