Как отфильтровать строки между двумя датами из файла CSV с помощью Python и перенаправить в другой файл?

1

Я новичок на Python. В качестве примера у меня есть файл CSV с данными ниже. Я хотел пропустить строки между определенным диапазоном дат (2018-08-01 - 2018-08-28) и перенаправить вывод в отдельный файл CSV. Обратите внимание: пустое место в заголовке "ПОСЛЕДНЕЕ ПОЛЬЗОВАНИЕ".

NUMBER,MAIL,COMMENT,COUNT,LAST USE,PERCENTAGE,TEXTN
343,[email protected],"My comment","21577",2018-08-06,80.436%,
222,[email protected],"My comment","31181",2018-07-20,11.858%,
103,[email protected],"My comment",540,2018-06-14,2.013%,
341,[email protected],"My comment",0,N/A,0.000%,

Любая идея была бы весьма признательна.

Теги:
pandas
csv
python-3.x
datetime

2 ответа

1
Лучший ответ

С Pandas это прямолинейно:

import pandas as pd

# read file
df = pd.read_csv('file.csv')

# convert to datetime
df['LAST USE'] = pd.to_datetime(df['LAST USE'])

# calculate mask
mask = df['LAST USE'].between('2018-08-01', '2018-08-28')

# output masked dataframes
df[~mask].to_csv('out1.csv', index=False)
df[mask].to_csv('out2.csv', index=False)

Вы также можете комбинировать логические массивы для создания mask. Например:

m1 = df['LAST USE'] >= (pd.to_datetime('now') - pd.DateOffset(days=30))
m2 = df['LAST USE'] <= pd.to_datetime('now')
mask = m1 & m2
  • 0
    Абсолютно идеальный сэр. Только один запрос, как сделать даты динамическими? Я пытался - mask = df ['LAST USE']. Между (date.today () - timedelta (30), date.today ()), но, похоже, не в порядке.
  • 0
    @SamironMallick, Есть много способов решить эту проблему, взглянуть на некоторые другие ответы, например, здесь и здесь . Если вы все еще застряли, задайте новый вопрос, показывающий, где именно вы застряли.
Показать ещё 2 комментария
0

диктофон: https://docs.python.org/3/library/csv.html#csv.DictReader

Документация по Strptime: https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior

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

Для каждой строки мы преобразуем строку даты/времени в фактический объект даты/времени, который python может затем сравнить с вашим диапазоном дат. Если значение находится в пределах диапазона, мы будем записывать всю строку в отдельный файл CSV.

import datetime, csv

#define all the fieldnames in the input CSV file (for use in creating / appending to output CSV file)
fieldnames = ['NUMBER','MAIL','COMMENT','COUNT','LAST USE','PERCENTAGE','TEXTN']

#open input CSV file as readonly
with open("input.csv", "r") as fin:
    #create a CSV dictionary reader object
    csv_dreader = csv.DictReader(fin)
    #iterate over all rows in CSV dict reader
    for row in csv_dreader:
        #check for invalid Date values
        if 'N/A' not in row['LAST USE']:
            #convert date string to a date object
            datetime_val = datetime.datetime.strptime(row['LAST USE'], '%Y-%m-%d')
            #check if date falls within requested range
            if datetime_val > datetime.datetime(2018, 8, 1) and datetime_val < datetime.datetime(2018, 8, 28):                
                #if it does, open output CSV file for appending
                with open("output.csv", "a") as fout:
                    #create a csv writer object using the fieldnames defined above
                    csv_writer = csv.DictWriter(fout, fieldnames=fieldnames)
                    #write the current row (from the input CSV) to the output CSV file
                    csv_writer.writerow(row)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню