如何从文本文件中的一行转换日期和时间?

时间:2016-06-02 18:42:43

标签: python python-2.7 python-3.x

我想知道是否有办法从文本文件中的行中的预设值转换日期和时间。

对于日期转换,我需要一年中的某一天。我找到了使用此代码获取当年当前日期的方法:

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

为了理解示例文本文件的时间,“T”后面的2个字符代表小时,冒号“:”后面的2个字符代表分钟。 日期,短划线“ - ”之间的2个字符代表月份,“T”之前的2个字符代表天数。例如1.a,时间 00是小时,00是分钟。 日期 01是月(1月),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来说仍然是新手,所以对所有事情都不熟悉。

那么我如何实现或添加当前代码的日常和时间两次转换?这样做的目的是让我可以运行一个通用代码,它将运行并为我提供相同的输出,格式和转换,以及其他具有不同值的文本文件。

对正确方向的任何帮助表示赞赏。

注意 我不确定这个问题是否与其他内容重复。我不是很确定如何正确地说出我的问题,所以如果它最终成为一个副本,我会道歉。而且,这不适合学校。仅供我个人在工作中使用以运行不同的文本文件并提取/打印行的特定部分。

3 个答案:

答案 0 :(得分: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.yeard.hour等等。

答案 1 :(得分: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时间串就很简单了:

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()))}

答案 2 :(得分: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()