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

#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)