2016-06-02 7 views
2

Мне было интересно, есть ли способ конвертировать дату и время из заданного значения в строку из текстового файла.Как преобразовать дату и время из строки в текстовый файл?

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

from datetime import datetime 
day_of_year = datetime.now().timetuple().tn_yday 
print day_of_year 

Но потребуется это за прошлые годы также (исключая, 1991, 1995, 2004).

Для преобразования времени мне нужны секунды. Код у меня есть, что превращает часы, минуты и секунды до нескольких секунд в день:

def get_sec(s): 
    x = s.split(':') 
    return int(x[0]) * 3600 + int(x[1]) * 60 + int(x[2]) 
    print get_sec('17:36:00) //gives me an output of 63360 

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

Образец текстового файла У меня есть, позволяет называть его datetime.txt, является:

1.a Date Installed : 1991-01-19T00:00Z 
    Date Removed : 1993-02-08T00:00Z 

1.b Date Installed : 1993-02-09T00:00Z 
    Date Removed : 1994-01-12T00:00Z 

1.c Date Installed : 1994-01-12T00:00Z 
    Date Removed : 1994-02-16T17:36Z 

Для того, чтобы разобраться в текстовом файле примера, за время, в 2 символа после «T» представляет часы и 2 символа после двоеточия ':' представляет минуты. На дату, два символа между штрихами '-' представляют месяцы, а 2 символа перед «Т» представляют дни. Так, например, 1.a, время 00 - часы, 00 минут. дата 01 месяцев (январь), 19 дней.

текущий код у меня есть сейчас:

with open('datetime.txt', 'r') as dt: 
for line in dt: 
    header = line.split(':')[0] 
    if 'Date Installed' in header: 
     year = line.split(':')[1].strip()[2:4] 
     day_of_year = line.split(':')[1].strip()[5:7] + line.split(':')[1].strip()[8:10] 
     sec_of_day = line.split(':')[1].strip()[14:16] 
     print year, 
     print day_of_year, 
     print sec_of_day 

Индексы, которые я добавил, чтобы сказать, какие символы из строки в текстовом файле для печати, от начала до конца.

Я застрял в этой части своего сценария некоторое время. Еще новичок в Python, так что не все спокойно знакомы со всем.

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

Любая помощь в правильном направлении оценивается.

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

+1

Почему вы не используете стандартную поддержку даты и времени в библиотеке Python (называется, изобретательно, ['datetime'] (https://docs.python.org/2/library/datetime.html))? – jonrsharpe

ответ

1

хорошо, как только вы получили 1993-02-09T00:00Z строку, вы можете просто сделать

import time, datetime 
d = datetime.datetime.fromtimestamp(time.strptime('1993-02-09T00:00Z', '%Y-%m-%dT%H:%MZ')) 

, который даст вам datetime объект, который можно использовать соответственно

Итак, вы можете сделать что-то вроде d.year , d.hour и т. Д.

+1

Если я не ошибаюсь, 'datetime.datetime.strptime ('1993-02-09T00: 00Z', '% Y-% m-% dT% H:% MZ')' будет работать. – elethan

+0

Хорошо, спасибо, спасибо. Но есть ли способ избежать необходимости вводить дату в коде? Или это не может быть и речи, и как мне это сделать? Извините, если это глупый вопрос. Просто выглядит утомительно, когда нужно вводить даты каждый раз. –

+0

downvote. Вы пытались запустить его? 'fromtimestamp()' ожидает время unix (float), но 'time.strptime()' return 'time.struct_time()' tuple. Кроме того, 'Z' подразумевает время UTC, тогда как' fromtimestamp() 'возвращает локальное время как наивный объект datetime (потенциально двусмысленное значение). 'datetime.strptime()' (в этом случае) возвращает время UTC как объект datetime (он всегда существует и уникален). – jfs

0

Ваше время отформатировано в соответствии со спецификацией iso 8601.

Вы можете использовать dateutil для разбора форматированных данных iso8601.

data = """ 
1.a Date Installed : 1991-01-19T00:00Z 
    Date Removed : 1993-02-08T00:00Z 

1.b Date Installed : 1993-02-09T00:00Z 
    Date Removed : 1994-01-12T00:00Z 

1.c Date Installed : 1994-01-12T00:00Z 
    Date Removed : 1994-02-16T17:36Z 
""" 

# Regular expression to find matches in the input data 
import re 

regex_pattern = re.compile(r""" 
    (?P<key>\d+\.\w+).*?    # the key is <digits>.<letters> 
    (?P<installed>[-:TZ0-9]{17}).*? # the timestamps have length 17 
    (?P<removed>[-:TZ0-9]{17}) 
    """, 
    flags = re.VERBOSE | re.MULTILINE | re.DOTALL 
) 

Регулярное выражение не очень сложное. Подробный флаг и именованные шаблоны - это просто, чтобы сделать его более читаемым. Вот подробное объяснение выражения: https://regex101.com/r/oT0rG3/1

После того, как мы выделили спички, разборе ISO timestrings тривиальна:

from dateutil.parser import parse 

# Dictionary comprehension on the regex matches 
items = { 
    key: tuple(parse(ts) for ts in timestamps) 
    for key, *timestamps in regex_pattern.findall(data) 
} 

Окончательный вывод items является словарь:

{'1.a': (datetime.datetime(1991, 1, 19, 0, 0, tzinfo=tzutc()), 
     datetime.datetime(1993, 2, 8, 0, 0, tzinfo=tzutc())), 
'1.b': (datetime.datetime(1993, 2, 9, 0, 0, tzinfo=tzutc()), 
     datetime.datetime(1994, 1, 12, 0, 0, tzinfo=tzutc())), 
'1.c': (datetime.datetime(1994, 1, 12, 0, 0, tzinfo=tzutc()), 
     datetime.datetime(1994, 2, 16, 17, 36, tzinfo=tzutc()))} 
0

Если все даты находятся в одном формате, тогда их легко извлечь из файла (не проверено):

#!/usr/bin/env python 
from datetime import datetime 

dates = {} # date -> label 
with open('datetime.txt') as file: 
    for line in file: 
     label, colon, date_string = line.partition(':') 
     if colon: 
      utc_time = datetime.strptime(date_string.strip(), '%Y-%m-%dT%H:%MZ') 
      dates[utc_time] = label.strip() 
Смежные вопросы