Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从日期时间列表中提取天、小时和秒_Python_Datetime_Itertools - Fatal编程技术网

Python 从日期时间列表中提取天、小时和秒

Python 从日期时间列表中提取天、小时和秒,python,datetime,itertools,Python,Datetime,Itertools,我有一个很长的datetimes列表,按时间顺序排序(如果您愿意,可以单调递增)。想象一下: import datetime dates=[datetime.datetime.fromtimestamp(xx) for xx in xrange(huge_number)] 与我的真实列表不同的是,时间步长并不总是恒定的,通常在秒、小时或天之间存在间隔 我想做的是让用户(通过PyQt4 GUI)选择一个精确的日期时间,我猜是这样做的: 获取datetimes\u列表中包含的所有不同日期 对于每一

我有一个很长的
datetime
s列表,按时间顺序排序(如果您愿意,可以单调递增)。想象一下:

import datetime
dates=[datetime.datetime.fromtimestamp(xx) for xx in xrange(huge_number)]
与我的真实列表不同的是,时间步长并不总是恒定的,通常在秒、小时或天之间存在间隔

我想做的是让用户(通过PyQt4 GUI)选择一个精确的日期时间,我猜是这样做的:

  • 获取
    datetimes\u列表中包含的所有不同日期
  • 对于每一天,建立一个列表,列出与这一天对应的所有不同时间
  • 对于每个小时,获取与该小时对应的完整瞬间列表

  • 当然,我可以用一些For/if循环来实现这一点,但我想知道是否有一种高效而紧凑的方法来实现这一点,可以使用
    itertools
    groupby
    迭代器。但是如果我真的不喜欢使用
    itertools
    ,那么如果有人有这样的想法那就太好了

    为什么不使用字典或订购的信息:

    import collections
    d=collections.OrderedDict()
    for e in dates:
        d.setdefault(e.strftime('%Y%m%d'),collections.OrderedDict()).setdefault(e.strftime('%H'), []).append(e.strftime('%H%M%S'))
    
    或采用不太紧凑但更具可读性的公式:

    import collections
    d=collections.OrderedDict()
    for e in dates:
        day, hour, full_time=e.strftime('%Y%m%d'), e.strftime('%H'), e.strftime('%H%M%S')
        d.setdefault(day,collections.OrderedDict()).setdefault(hour, []).append(full_time)
    

    它将导致任何日期选择/任何小时选择的O(1)访问时间

    您可以使用在排序列表中查找特定的日期时间。您应该(可能)动态构建2和3个列表,以响应用户从上一个列表中选择的条目。注意:本地时间不一定是单调的(例如,由于DST转换),因此在您的情况下,
    fromtimestamp()
    的结果不一定会增加(取决于您的本地时区)非常感谢你的回答。这对我来说太好了!酷。如果你把这个答案标记为ok,那就太好了。