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