在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 的格式仅限于这两个值utc
、gmt
和您的本地时区(根据我的 /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 -> -0400
、EST -> -0500
、PST -> -0800
。
输出
168 days, 0:00:00
10 days, 21:00:00
differences
是timedelta
对象的列表,您可以使用td.days
属性(对于非负间隔)获取全天或获取包含分数的值:
days = td.total_seconds() / 86400
【讨论】:
以上是关于在python中查找字符串时间对象之间的差异的主要内容,如果未能解决你的问题,请参考以下文章