#python #csv
#python #csv
Вопрос:
Для назначения мне нужно создать список ставок в порядке даты из файла CSV. Файл выглядит следующим образом (пример):
Aintree, Red Rum,2017,5,12,11.58, won
Aintree, Hurricane Fly,2017,5,12,11.58, won
Aintree, Murder,2017,5,12,5, lost
Ayr, Corbiere,2016,11,3,25, lost
Я хотел бы создать новый столбец для каждой строки [2],[3],[4]
, объединяющейся '%d-%b-%y'
в формате CSV. Затем мне нужно использовать этот новый столбец в качестве ключа для создания списка ставок [5]
в порядке даты.
У меня есть этот код ниже, будучи новичком в python, я не добился большого успеха и не уверен, что что-то идет не так. При запуске возникает эта ошибка:
Traceback (most recent call last):
File "date_bet.py", line 25, in <module>
get_date()
File "date_bet.py", line 10, in get_date
data = list(csv.reader(csvFile))
io.UnsupportedOperation: not readable
Код:
import csv
from datetime import datetime
def get_date():
with open('results.csv', 'a') as csvFile:
writer = csv.writer(csvFile)
reader = csv.reader(csvFile)
all = []
data = list(csv.reader(csvFile))
row = next(csvFile)
row.append([7])
all.append(row)
for row in data:
row.append((data[4],data[3],data[2]), '%d-%b-%y')
all.append(row)
writer.writerows(all)
date = datetime.date(row[7], '%x')
print(row[5], key = date)
get_date()
Комментарии:
1. Похоже, вы не вызываете свою
get_date
функцию.2. Извините, это была глупая ошибка. Когда я звоню, я получаю эту ошибку, трассировка (последний последний вызов): File «date_bet.py «, строка 25, в файле <module> get_date() «date_bet.py «, строка 10, в get_date data = list(csv.reader(csvFile)) io.Неподдерживаемая операция: не читается
3. Джек: Пожалуйста, укажите обратную трассировку в своем вопросе (и добавьте отсутствующий вызов
get_date()
).4. Вы открываете свой файл в режиме
'a'
(который не является режимом чтения), а затем пытаетесь прочитать из него.5. Если я откроюсь в режиме ‘r’, нужно ли мне создавать csv-файл через режим ‘w’, а затем создавать новый столбец?
Ответ №1:
Возможно, вам следует рассмотреть возможность использования pandas для достижения того, чего вы хотите.
Я хотел бы создать новый столбец для каждой строки, объединяющей 2,3, [4] в формате ‘%d-%b-%y’
import pandas as pd
df = pd.read_csv(<your_file_name>, header=None)
Добавьте столбец с помощью pd.to_datetime
функции:
df['date'] = pd.to_datetime(dict(year=df[2], month=df[3], day=df[4]), format='%d-%b-%y')
df
0 1 2 3 4 5 6 date
0 Aintree Red Rum 2017 5 12 11.58 won 2017-05-12
1 Aintree Hurricane Fly 2017 5 12 11.58 won 2017-05-12
2 Aintree Murder 2017 5 12 5.00 lost 2017-05-12
3 Ayr Corbiere 2016 11 3 25.00 lost 2016-11-03
Затем мне нужно использовать этот новый столбец в качестве ключа для создания списка ставок [5] в порядке даты.
df.sort_values('date', inplace=True)
print(df[[5, 'date']].reset_index(drop=True)) # reset index so that you don't see the mixedup index.
5 date
0 25.00 2016-11-03
1 11.58 2017-05-12
2 11.58 2017-05-12
3 5.00 2017-05-12
Вы можете сохранить это в формате csv с помощью df.to_csv()
метода.
Комментарии:
1. Большое вам спасибо, это очень полезно. Я проголосовал за ваш ответ, но в нем говорится, что моя репутация слишком низкая, чтобы публично ее изменять.
Ответ №2:
Использование pandas. Добавление нового столбца с именем «дата» и сортировка данных по новому столбцу.
import pandas as pd
df = pd.read_csv('55611308.csv', sep=',', names=['name0', 'name1', 'y', 'm', 'd', 'h', 'result'], header=None)
df['date'] = df['y'].astype(str).str.cat(df['m'].astype(str), sep='-').str.cat(df['d'].astype(str), sep='-')
df.sort_values('date',inplace=True)
print(df)