2017-01-06 3 views
1

Входные данные поступают из файла CSV, в котором даты форматируются в AM/PM, а затем библиотека Pandas используется для экспорта csv в таблицу базы данных sqlite.Преобразование 12-часового формата в 24 часа Python

Есть ли какие-либо элегантные решения или встроенная функция для python 2.7 или 3 для преобразования этих 12-часовых дат в формат 24 часа, желательно, прежде чем они будут записаны в базу данных? Мне нужно сравнить даты, которые будут импортированы в базу данных.

Следующий код используется:

import pandas as pd 
import datetime as dt 

from sqlite3 import connect 
from glob import iglob 
from os.path import splitext, basename 


dbName = 'logs' 
logsDir = 'event_logs' 

def csvToDb(db, filename): 
    conn = connect(db) 
    df = pd.read_csv(filename,encoding='utf-8') 
    df.to_sql(splitext(basename(filename))[0], conn) 
    conn.close() 


def csvLogsToDb(directory): 
    for filename in iglob(directory + '/*.csv'): 
     print('WRITING TO DB | ' + filename) 
     csvToDb(dbName, filename) 

    print("DONE") 


if __name__ == "__main__": 
    csvLogsToDb(logsDir) 

я удалил большую часть данных и хранится наиболее актуальной, но в двух словах, это мой входной ток и нужен выход

ВХОД CSV DATA:

Level,DateTime  
Information,2017/01/06 9:06:02 AM 
Information,2017/01/06 9:02:44 AM 
Information,2017/01/06 8:56:48 PM 

CURRENT OUTPUT

COL1  
    Information  
    Information 
    Information 

COL2 
    2017/01/06 9:06:02 AM 
    2017/01/06 9:02:44 AM 
    2017/01/06 8:56:48 PM 

ЗАПЛАНИРОВАННЫЕ

COL1 
    Information 
    Information 
    Information 

COL2 
    2017-01-06 09:06:02 
    2017-01-06 09:02:44 
    2017-01-06 20:56:48 
+1

Возможный дубликат [Как я могу указать период (AM/PM) с datetime.strptime?] (Http://stackoverflow.com/questions/1759455/how-can-i-account-for-period-am- pm-with-datetime-strptime) –

+0

Так как AM или PM указаны в эти даты? Речь идет только о настройке парсера для дат, чтобы прочитать эту информацию. –

+0

@MartijnPieters: Даты CSV даны в следующем формате: '2017/01/05 7:43:25 PM'. Извините, если этот вопрос глупо. Я использовал Python в течение некоторого времени, но не делаю этого часто, поскольку я в основном использую C#. – Elmar

ответ

2

Просто скажите pandas.read_csv() разобрать даты, см datetime parsing options available.

Параметр dateutil.parser по умолчанию может обрабатывать время с AM/PM из коробки. Установите опцию parse_dates в список индексов столбцов, которые вы хотите проанализировать. Для вашего ввода пробы, что бы колонки 1:

>>> import pandas 
>>> from io import BytesIO 
>>> data = BytesIO(b'''\ 
... Level,DateTime 
... Information,2017/01/06 9:06:02 AM 
... Information,2017/01/06 9:02:44 AM 
... Information,2017/01/06 8:56:48 PM 
... ''') 
>>> pandas.read_csv(data, parse_dates=[1]) 
     Level  DateTime 
0 Information 2017-01-06 09:06:02 
1 Information 2017-01-06 09:02:44 
2 Information 2017-01-06 20:56:48 
+0

Прекрасно работает! Изменение parse_dates = true TO parse_dates = [1] сделал трюк. Спасибо за ваше время и терпение. Я очень ценю это. – Elmar

0

Вы можете использовать пакет DATETIME, чтобы получить это сделать

from datetime import datetime 
data = '2:35 PM' 
standard_time_format = datetime.strptime(data, "%I:%M %p") 
only_in_24_hour_format = datetime.strftime(standard_time_format, "%H:%M") 
print only_in_24_hour_format 
print standard_time_format 

Это дало бы следующий как выход

14: 35

1900-01-01 14:35:00

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