【问题标题】:Grouping timestamp strings by day in python在python中按天分组时间戳字符串
【发布时间】:2018-06-03 23:54:10
【问题描述】:

我有许多文件,按日期顺序排列,格式为YYMMDD_hhmmss.txt 我只想根据文件的日期来隔离文件。

每天将有 24 个文件,每小时 1 个...我想将每天的所有文件隔离到单独的列表中。

day = 1
list_for_a_day = []

for filename in all_files:
     if '%s' % (day) in filename:
          list_for_a_day.append(filename)
          day += 1
          if day > 31:
             pass

这显然是错误的处理方式。如果我有 3 天的文件,每天有 24 个文件,那就是 72 个文件...我想要 3 个列表,每个列表都包含每个文件的相关文件天。

【问题讨论】:

    标签: python python-3.x string timestamp


    【解决方案1】:

    使用字典怎么样?这是我如何做到这一点的高级概述。

    1. 遍历所有文件名
    2. 对于每个文件名,提取日期属性(我只是使用字符串拆分,假设您的文件名结构一致,这应该可以工作)
    3. 将该文件添加到字典中由day 索引的列表中。
    files = {}
    for filename in all_files:
        day = filename.split('_')[0][-2:]   
        files.setdefault(day, []).append(filename)
    

    files 看起来像这样:

    { 
        day1 : [f11, f12, ...],
        day2 : [f21, f22, ...], 
        ...
    }
    

    请注意,键是字符串,但它们也可以很容易地成为整数,前提是您提前将 day 转换为 int

    【讨论】:

    • 有了这个解决方案,10 月 1 日和 12 月 1 日将进入同一个列表
    • @gogaz I want to isolate the files based on their days only.
    【解决方案2】:

    我认为,您应该为此使用 dict of int->list of stings

    def sep_file_by_days(filename_list):
    filenames_by_day = dict()
    
    for filename in filename_list:
        day = int(filename[4:6])
    
        if not day in filenames_by_day:
            filenames_by_day[day] = []
    
        filenames_by_day[day].append(filename)
    
    return filenames_by_day
    

    【讨论】:

      【解决方案3】:

      如果您不想手动处理异常(例如 bissextile 年份、月份中的天数),您可以通过 datetime 解析:

      import datetime
      
      fmt = "%02d%02d%02d"
      starting_date = datetime.datetime(year=2016, month=1, day=1)
      for _ in range(365):
         starting_date += datetime.timedelta(days=1)
         list_for_a_day = [filename for filename in all_files if filename[-16:-11] in fmt % (abs(starting_date.year)%100, starting_date.month, starting_date.day)]
      

      通过这种方式,您可以解析从 2016 年 1 月 1 日到 2017 年 1 月 1 日(365 天)的每一天,并获取在给定位置具有该日期的每个文件的列表。 希望对你有帮助

      【讨论】:

      • 无论如何@COLDSPEED 解决方案在大多数情况下都更好
      【解决方案4】:

      我会选择defaultdict 的列表。 dict 的键是日期。这些值将是该日期的文件名列表。

      from glob import glob
      from datetime import datetime
      from collections import defaultdict
      
      files_for_date = defaultdict(list)
      
      for filename in glob('*.txt'):
          try:
              date = datetime.strptime(filename, '%Y%m%d_%H%M%S.txt').date()
              files_for_date[date].append(filename)
          except ValueError as exc:
              print('Skipping file {}'.format(filename))
      

      在此files_for_date 之后,会将同一天(日期)的文件名分组到由datetime.date 对象键入的列表中。

      如果您愿意,可以使用str(date)strftime()date 对象转换为字符串,例如

      files_for_date[date.strftime('%Y%m%d')].append(filename)
      

      将产生格式为 YYYYMMDD 的字符串键。

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 2013-01-24
        • 1970-01-01
        • 2015-02-12
        • 2021-04-29
        • 2015-04-19
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        相关资源
        最近更新 更多