Как создать новый столбец в файле 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() 

Похоже, вы не вызываете свою функцию get_date.

khelwood 10.04.2019 13:23

Извините, это была глупая ошибка. Когда я звоню, я получаю эту ошибку, Traceback (последний последний вызов): Файл "date_bet.py", строка 25, в <module> get_date() Файл "date_bet.py", строка 10, в get_date data = list(csv .reader(csvFile)) io.UnsupportedOperation: не читается

Jack Bennett 10.04.2019 13:31

Джек: Пожалуйста, поместите трассировку в в свой вопрос (и добавьте отсутствующий вызов в get_date()).

martineau 10.04.2019 13:33

Вы открываете файл в режиме 'a' (который не является режимом чтения), а затем пытаетесь прочитать его.

khelwood 10.04.2019 13:34

Если я открою в режиме «r», мне нужно создать csv через режим «w», а затем создать новый столбец?

Jack Bennett 10.04.2019 13:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, вам следует подумать об использовании панды для достижения того, чего вы хотите.

I would like to create a new column for each row combining 2,3,[4] in format '%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

I then need to use this new column as the key to produce a list of bets [5] in date order.

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().

Большое спасибо, это очень полезно. Я проголосовал за ваш ответ, но в нем говорится, что моя репутация слишком низка, чтобы публично ее изменить.

Jack Bennett 10.04.2019 13:59

Использование панд. Добавление нового столбца с именем «дата» и сортировка данных по новому столбцу.

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)

Другие вопросы по теме