我有一个我正在从文件中读取的字符串列表 - 每个字符串都有一个存储数据时记录的时间偏移量。
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
答案 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 timestamps和finding 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 -> -0400
,EST -> -0500
,PST -> -0800
。
168 days, 0:00:00
10 days, 21:00:00
differences
是timedelta
个对象的列表,您可以使用td.days
属性获取整天(非负间隔)或获取包含分数的值:
days = td.total_seconds() / 86400