【问题标题】:Finding difference between string time objects in python在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

【问题讨论】:

    标签: python-2.7 date datetime pytz


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多