вывод файла в CSV

#python #python-3.x #csv

#python #python-3.x #csv

Вопрос:

Я пытаюсь проанализировать данные из файла json и создать csv-файл из этого вывода. Я написал скрипт python для создания выходных данных в соответствии с моими потребностями. Мне нужно отсортировать приведенный ниже файл csv по времени и дате.

выход по току

выход по току

Мой код:

 ## Shift Start | End time. | Primary | Secondary
def write_CSV () :
    # field names
    fields = ['ShiftStart', 'EndTime', 'Primary', 'Secondary']
    # name of csv file
    filename = "CallingLog.csv"

    # writing to csv file
    with open(filename, 'w') as csvfile:
        # creating a csv dict writer object
        writer = csv.DictWriter(csvfile, delimiter=',', lineterminator='n', fieldnames = fields)
        # writing headers (field names)
        writer.writeheader()
        # writing data rows
        writer.writerows(totalData)
 

Я хочу, чтобы мой CSV-файл был отсортирован по дате и времени, как показано ниже. по крайней мере, свидание было бы в порядке вещей.

 ShiftStart                           
2020-11-30T17:00:00-08:00       
2020-12-01T01:00:00-08:00       
2020-12-02T05:00:00-08:00       
2020-12-03T05:00:00-08:00       
2020-12-04T09:00:00-08:00       
2020-12-05T13:00:00-08:00       
2020-12-06T13:00:00-08:00       
2020-12-07T09:00:00-08:00       
2020-12-08T17:00:00-08:00       
2020-12-09T09:00:00-08:00       
2020-12-10T09:00:00-08:00       
2020-12-11T17:00:00-08:00
 

Комментарии:

1. сортировка totalData перед передачей в writerows

2. Я попробовал несколько предложений в stackoverflow. но почему-то это не удается сделать. что именно я должен? @rdas

Ответ №1:

 YourDataframe.sort_values(['Col1','Col2']).to_csv('Path')
 

Попробуйте это, это не только сортировка и копирование в csv, но и сохранение исходного фрейма данных без сортировки в программе для дальнейших операций, если это необходимо ..!

Комментарии:

1. Спасибо @Brainiac, в какую строку я должен добавить это. не могли бы вы быть более конкретными. Я новичок в python. это будет действительно полезно

Ответ №2:

Вы можете адаптировать этот пример к своим данным (которых у меня нет в моем распоряжении -:)

 from csv import DictReader, DictWriter
from sys import stdout

# simple, self-contained data
data = '''
a,b,c
3,2,1
2,2,3
1,3,2
'''.splitlines()

# read the data
dr = DictReader(data)
rows = [row for row in dr]

# print the data

print('# unsorted')
dw = DictWriter(stdout, dr.fieldnames)
dw.writeheader()
dw.writerows(rows)

print('# sorted')
dw = DictWriter(stdout, dr.fieldnames)
dw.writeheader()
dw.writerows(sorted(rows, key=lambda d:d['a']))
# unsorted
a,b,c
3,2,1
2,2,3
1,3,2
# sorted
a,b,c
1,3,2
2,2,3
3,2,1

In [40]: 
 

Когда вы считываете данные с помощью a DictReader , каждый элемент списка rows представляет собой словарь, набранный в именах полей первой строки файла данных CSV.

Когда вы хотите отсортировать этот список по значениям, соответствующим ключу, вы должны указать sorted key аргумент, то есть функцию, которая возвращает значение, по которому вы хотите выполнить сортировку.

Эта функция вызывается со всем элементом, подлежащим сортировке, в вашем случае со словарем, и мы хотим выполнить сортировку по первому полю CSV, тому, которое индексируется 'a' , так что наша функция, использующая лямбда-синтаксис для вставки определения в вызов функции, просто lambda d: d['a'] возвращает значение по которым мы хотим провести сортировку.

ОБРАТИТЕ внимание, что сортировка в этом случае сортируется в алфавитном порядке и работает, потому что я имею дело с однозначными цифрами, в общем случае вам, возможно, потребуется преобразовать значение (по умолчанию строка) во что-то другое, что имеет смысл в вашем контексте, например, lambda d: int(d['a']) .

Комментарии:

1. Я завершил свой ответ объяснением и важным примечанием. В вашем случае это зависит от того, указана ли дата в формате ISO, вы можете просто использовать лексикографический порядок, иначе вам придется конвертировать…

2. что представляет этот ‘d’. в моем случае a == shiftstart. ?

3. @Sreeman » == shiftstart ?» ? Однако. Мы сортируем rows список dicts, используя специальную функцию, определенную на месте с использованием синтаксиса lambda. Хорошо? Эта функция применяется к каждому элементу rows (т.Е. dict), и сортировка выполняется по результатам этих оценок функций. ОК? Функция обязательно должна использовать имя для ссылки на элемент, с которым она работает, и это имя выбирается человеком, который определяет функцию, в нашем случае мной… Я решил, что, поскольку функция работает с dict (элементами rows являются dicts), имя будет d таким же, как в d ictionary.