我有一个基于时间戳的字符串列表(date_millisecondtime.csv),如下所示:
[..., file_20181105_110001.csv, file_20181105_120002.csv, file_20181105_130002.csv, file_20181105_140002.csv, file_20181105_150003.csv, file_20181105_160002.csv, file_20181105_170002.csv, file_20181105_200002.csv,
file_20181105_210002.csv, file_20181106_010002.csv, file_20181106_020002.csv, file_20181106_030002.csv...]
因此此处文件的日期为2018-11-05(2018年11月5日),时间戳为11、12、13、14、15、16、17、20和21。
我只想打印文件名18和19,因为它们丢失了。有效时间范围是1-23,因此,如果在给定的一天(此处为2018-11-05)在此范围内不存在小时的文件名,请打印那些丢失的小时文件。
答案 0 :(得分:2)
一种解决方案是使用集合理解来提取当前时间。如果我了解您的要求,则可以计算min
和max
次,并与从set
派生的range
取差:
L = ['file_20181105_110001.csv', 'file_20181105_120002.csv', 'file_20181105_130002.csv',
'file_20181105_140002.csv', 'file_20181105_150003.csv', 'file_20181105_160002.csv',
'file_20181105_170002.csv', 'file_20181105_200002.csv', 'file_20181105_210002.csv']
present = {int(i.rsplit('_', 1)[-1][:2]) for i in L}
min_time, max_time = min(present), max(present)
res = set(range(min_time, max_time)) - present # {18, 19}
然后可以从缺少的时间构建文件名。我将把它保留为练习[提示:列表理解]。
答案 1 :(得分:0)
如果您还需要检查列表开头/结尾缺少的文件(例如,小时0-10、22和23),则可以采用另一种解决方案
filenames = ['file_20181105_110001.csv', 'file_20181105_120002.csv', 'file_20181105_150003.csv']
pos = 0
for h in range(0, 23):
n = "file_20181105_" + str(h).zfill(2)
if pos < len(filenames) and n == filenames[pos][: len(n)]:
print("Found", h)
pos += 1
else: print("Not found", h)
当然,您可以通过多种方式来构建n
。如果需要,您可以创建另一个循环来运行几天。
编辑:
如果我们要检查一天以上的时间,则可以遍历检查文件/小时数的日子。
恕我直言,我建议根据使用情况,天数,文件名数量,首选项和代码样式等,对以下代码进行大量更改。
filenames = ['file_20181104_110001.csv', 'file_20181105_120002.csv', 'file_20181105_150003.csv']
pos = 0
missing = []
for d in (4, 5):
for h in range(0, 23):
n = "file_201811" + str(d).zfill(2) + "_" + str(h).zfill(2)
if pos < len(filenames) and n == filenames[pos][: len(n)]:
pos += 1
print("Found", d, h)
else:
print("Not Found", d, h)