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

时间:2015-02-16 09:56:29

标签: python-2.7 date datetime pytz

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

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'

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

2 个答案:

答案 0 :(得分:0)

我会使用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

答案 1 :(得分:0)

Converting time strings to POSIX timestampsfinding the differences仅使用stdlib:

#!/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