Извлечение данных по дате с использованием кода Python и сохранение в виде отдельного csv Datewise - PullRequest
1 голос
/ 22 мая 2019

Я должен извлечь данные по дате и сохранить их в виде отдельного csv для каждой отдельной даты: «время» задается в этом формате (2018-03-26T16: 09: 10.024101278Z) в одном столбце файла CSV.

Этот набор данных содержит более 100 тыс. Строк, взятых в разное время.«Я попытался создать фрейм данных». «Имя столбца: (имя, время, идентификатор версии ddr) для ссылки». «

dataset_CT= pd.read_csv("out_1.csv")
dataset_CT['Dates'] = pd.to_datetime(dataset_CT['time']).dt.date
dataset_CT['Time'] = pd.to_datetime(dataset_CT['time']).dt.time
dataset_CT.sort_values(by='Dates', axis=0, inplace=True)
dataset_CT.set_index(keys=['Dates'], drop=False,inplace=True)

Date_list=dataset_CT['Dates'].unique().tolist()

», получил Date_list вот так ([datetime.date (2018,3, 26), datetime.date (2018, 3, 31)]) "

Date_set = dataset_CT.loc[dataset_CT.Dates=='(2018, 3, 26)']

Я получил пустой фрейм данных, как показано ниже

      name  time id ddr version readings Dates  Time
Dates

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Когда вы читаете ввод с параметрами по умолчанию, я предполагаю, что у вас есть запятая (,) для разделителя и одна строка заголовка.ИМХО панды для этого здесь не требуется.Достаточно прочитать файл по одной строке за раз и записать его в CSV-файл, соответствующий дате.

Предостережения: добавьте заголовок в каждый выходной CSV-файл и создайте новый выходной файл для каждой новой даты.,collections.defaultdict с пользовательской функцией по умолчанию достаточно для удовлетворения этих требований 2.

Следующий код читает входной CSV-файл с именем "out_1.csv" и записывает его содержимое в группу файлов с именем out_2018-03-26.csv датадата всех строк в выходном файле:

with open("out_1.csv") as fdin:
    def get_defaults():
        """returns a pair (csv_writer, file_object) for date dat initialized with header"""
        filename = 'out{}.csv'.format(dat)
        fd = open(filename, "w", newline='')
        fd.write(header)
        return (csv.writer(fd), fd)
    outfiles = collections.defaultdict(get_defaults)
    rd = csv.reader(fdin)
    header = next(fdin)             # store the header to later initialize output files
    for row in rd:
        dat = row[1][:10]           # extract the date
        wr = outfiles[dat][0]
        wr.writerow(row)            # and write the row to the appropriate output file
    # close the output files
    for i in outfiles:
        outfile[i][1].close()

После второго размышления над этим кодом может остаться слишком много открытых файлов.Вот улучшенная версия, которая хранит открытые файлы только в течение 3 самых последних встреч (проверено):

with open("out_1.csv") as fdin:
    cache = collections.deque()
    seen = set()
    def get_defaults():
        """returns a pair (csv_writer, file_object) for date dat initialized with header"""
        filename = 'out{}.csv'.format(dat)
        fd = open(filename, 'a' if dat in seen else 'w', newline='')
        if 0 == fd.tell():          # file is currently empty: write header
            fd.write(header)
        ret = (csv.writer(fd), fd)
        cache.append(dat)
        seen.add(dat)
        if len(cache) > 3:          # only keep 3 open files
            old = cache.popleft()
            print("Closing", old)
            outfiles[old][1].close()
            del outfiles[old]
        return ret

    outfiles = collections.defaultdict(get_defaults)
    rd = csv.reader(fdin)
    header = next(fdin)   # store the header to later initialize output files
    for row in rd:
        dat = row[1][:10] # extract the date
        wr = outfiles[dat][0]
        wr.writerow(row)  # and write the row to the appropriate output file
    # close the currently opened output files
    for i in outfiles:
        outfiles[i][1].close()
1 голос
/ 22 мая 2019

Как работает сравнение по строке?

Date_set = dataset_CT.loc[dataset_CT.Dates=='2018-03-26']

Если не работает, попробуйте изменить Series.dt.date:

dataset_CT['Dates'] = pd.to_datetime(dataset_CT['time']).dt.date
Date_set = dataset_CT.loc[dataset_CT.Dates=='2018-03-26']

на Series.dt.floor для дат без времени:

dataset_CT['Dates'] = pd.to_datetime(dataset_CT['time']).dt.floor('d')
Date_set = dataset_CT.loc[dataset_CT.Dates=='2018-03-26']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...