2014-01-28 3 views
1

У меня есть CSV-файл с более чем 60 миллионов записей в нем в формате,Читать определенный диапазон дат из CSV-файла с помощью Python

2013-07-23 17:04:34, some data, some more data 

Я хочу написать скрипт на Python, который позволяет пользователю ставить в дате «Кому» и «От» в формате «2013-04-23» и «2013-04-25». Затем я хочу искать все записи в этом диапазоне и отображать их.

Я использую Python 2.7 на машине Windows 7 (с использованием Eclipse), но по завершении этот скрипт будет работать на сервере Red Hat Linux.

Таким образом, уменьшенная версия того, что у меня есть:

if __name__ == '__main__': 
    from_date = raw_input('\nEnter FROM Date (e.g. 2013-11-29) :') 
    from_date += ' 00:00:00' 
    print('From date: = ' + from_date) 
    to_date = raw_input('\nEnter TO Date (e.g. 2013-11-30) :') 
    to_date += ' 23:59:59' 

    in_file = './file.csv' 
    for line in in_file: 
     fields = line.split(',') 
     found_from_date = re.match(from_date, fields[0]) 
     if found_from_date: 
      found_to_date = re.match(to_date, fields[0]) 
      if found_to_date: 
       print(line) 

    in_file.close() 

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

Я немного поработал с Google и наткнулся на что-то по имени pandas, но перед загрузкой и обучением я просто хотел убедиться, что нет ничего более стандартного/упрощенного, и его можно обновить с помощью диспетчера пакетов Red Hat.

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

Заранее спасибо.

ответ

3

Модуль datetime - ваш друг здесь, видя, как он построил возможности сравнить даты. Я не могу вспомнить, если есть метод, который принимает в преформатированной строке и преобразует его в datetime.date, но это достаточно просто, чтобы разобрать, что немного из:

import datetime 

if __name__ == '__main__': 
    from_raw = raw_input('\nEnter FROM Date (e.g. 2013-11-29) :') 
    from_date = datetime.date(*map(int, from_raw.split('-'))) 
    print 'From date: = ' + str(from_date) 
    to_raw = raw_input('\nEnter TO Date (e.g. 2013-11-30) :') 
    to_date = datetime.date(*map(int, to_raw.split('-'))) 

    in_file = './file.csv' 
    for line in in_file: 
     fields = line.split(',') 
     found_date = datetime.date(*map(int, fields[0].split(' ')[0].split('-'))) 
     if from_date <= found_date <= to_date: 
      print line 

    in_file.close() 
+0

Спасибо, что очень безопасно. Получил его для работы с вашими предложениями, но для found_date я сделал это: 'file_date = datetime.datetime.strptime (поля [0],"% Y-% m-% d% H:% M:% S ")'. Единственным недостатком является то, что он работает медленно - требуется 22 минуты для обработки 65 000 000 записей, но он работает. В очередной раз благодарим за помощь. – Bruce

+0

@Bruce Я взглянул на 'strptime', и, по крайней мере, в моей системе, похоже, что он работает где-то примерно в 5-6 раз медленнее, чем' datetime.date' - по общему признанию, вы теряете время, но на основе вашего образца кода I не думайте, что это важно. Я обновил свой ответ, чтобы проанализировать временную часть временной метки (не заметил ее в первый раз), мне было бы интересно узнать, помогает ли она вообще. –

+0

ты чемпион. Скорость резко увеличилась - столько же записей закончилось за 4 минуты 32 секунды. Задача решена! – Bruce

1

Посмотрите на дату. http://labix.org/python-dateutil Возможно, rrule.between (после, до, inc = False) - это то, что вам нужно?

+0

Спасибо Биргит, некоторая полезной информацию там. – Bruce

Смежные вопросы