在python中按天分组时间戳字符串

时间:2017-12-21 10:16:26

标签: python python-3.x string timestamp

我有多个文件,按日期顺序排列,格式为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个列表,每个列表包含每个文件的相关文件一天。

4 个答案:

答案 0 :(得分:3)

如何使用字典?以下是我如何做的高级概述。

  1. 迭代所有文件名
  2. 对于每个文件名,提取day属性(我只是使用字符串拆分,假设您的文件名结构一致,这应该有效)
  3. 将该文件添加到字典中由day索引的列表中。
  4.  
    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,它们就可以很容易地成为整数。

答案 1 :(得分:0)

我认为,你应该使用int->这个

的stings列表的dict
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

答案 2 :(得分:0)

我要去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对象键入的列表中。

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

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

将导致格式为YYYYMMDD的字符串键。

答案 3 :(得分:0)

如果您不想手动处理异常(如bissextile年,几个月),您可以解析日期时间:

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日到1/1/2017(365天)的每一天,并获取在给定位置具有该日期的每个文件的列表。 希望它有用