在python中查找字符串时间对象之间的差异

Posted

技术标签:

【中文标题】在python中查找字符串时间对象之间的差异【英文标题】:Finding difference between string time objects in python 【发布时间】:2015-04-16 19:17:19 【问题描述】:

我有一个从文件中读取的字符串列表 - 每个字符串都有一个在存储数据时记录的时间偏移量。

date1= "Mon May 05 20:00:00 EDT 2014"
date2="Mon Nov 18 19:00:00 EST 2013"
date3="Mon Nov 07 19:00:00 PST 2013"

我需要找出每对字符串之间的天数差异。

from datetime import datetime
from dateutil import tz

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

date1='Fri Dec 05 19:00:00  2014' # it does not work with EDT, EST etc.
date2='Fri Dec 03 19:00:00 2014'

fmt = "%a %b %d %H:%M:%S  %Y"

str1 = datetime.strptime(date1, fmt)
str2 = datetime.strptime(date2, fmt)
td=(str1-str2)
x=days_hours_minutes(td)
print x
#gives (2, 0, 0)

基本上,将每个字符串转换为其“my_time_obj”,然后以天为单位取差。

但是,我的实际字符串日期有“EDT”、“EST”、“IST”等 - 在使用 %Z 表示法时,我得到了 ValueError: time data 'Fri Dec 05 19:00:00 EST 2014' does not match format '%a %b %d %H:%M:%S %Z %Y'

从日期时间文档中,我看到我可以使用 %Z 将其转换为时区表示法 - 我错过了什么? https://docs.python.org/2/library/datetime.html

【问题讨论】:

【参考方案1】:

我会使用 pytz 解析时区并执行类似的操作(假设您知道日期字符串是如何构建的):

from datetime import datetime
from dateutil import tz
from pytz import timezone

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

date1_str ='Fri Dec 05 19:00:00 2014 EST'
date2_str ='Fri Dec 03 19:00:00 2014 UTC'

fmt = "%a %b %d %H:%M:%S %Y"

date1_list = date1_str.split(' ')
date2_list = date1_str.split(' ')

date1_tz = timezone(date1_list[-1]) # get only the timezone without date parts for date 1
date2_tz = timezone(date2_list[-1]) # get only the timezone without date parts for date 2
date1 = date1_tz.localize(datetime.strptime(' '.join(date1_list[:-1]), fmt)) # get only the date parts without timezone for date 1
date2 = date2_tz.localize(datetime.strptime(' '.join(date2_list[:-1]), fmt)) # get only the date parts without timezone for date 2
td=(date1-date2)
x=days_hours_minutes(td)
print x

【讨论】:

当然这是后备黑客,但我正在寻找更多。 在这种情况下,似乎 strptime 的格式仅限于这两个值 utcgmt 和您的本地时区(根据我的 /usr/lib/python2.7/_strptime.py 第 212 行)【参考方案2】:

Converting time strings to POSIX timestamps 和 finding the differences 仅使用标准库:

#!/usr/bin/env python
from datetime import timedelta
from email.utils import parsedate_tz, mktime_tz

dates = [
    "Mon May 05 20:00:00 EDT 2014",
    "Mon Nov 18 19:00:00 EST 2013",
    "Mon Nov 07 19:00:00 PST 2013",
]
ts = [mktime_tz(parsedate_tz(s)) for s in dates] # timestamps
differences = [timedelta(seconds=a - b) for a, b in zip(ts, ts[1:])]
print("\n".join(map(str, differences)))

阅读上面有关输入的继承歧义的链接。如果您想要更强大的解决方案;您必须使用明确的pytz 时区,例如'America/New_York'email module hardcodes "timezone abbr. to utc offset" mapping,例如EDT -> -0400EST -> -0500PST -> -0800

输出

168 days, 0:00:00
10 days, 21:00:00

differencestimedelta 对象的列表,您可以使用td.days 属性(对于非负间隔)获取全天或获取包含分数的值:

days = td.total_seconds() / 86400

【讨论】:

以上是关于在python中查找字符串时间对象之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

查找列表中连续数字之间的差异(Python)

Python Pandas - 查找两个数据帧之间的差异

Python 3.5 与 2.7 之间字​​符串连接的巨大时间差异

正则表达式在 Python 中查找两个字符串之间的字符串

Python中list总结

使用python查找两个csv文件列之间的差异