Python:随时间迭代文件
我有一个以向后日期和时间戳开头的文件列表:Python:随时间迭代文件,python,date,time,Python,Date,Time,我有一个以向后日期和时间戳开头的文件列表: 201705150000_* 201705150005_* 201705150010_* 201705150015_* 我正在编写一个脚本,用户将在其中输入开始时间和所需的持续时间,例如3小时。然后脚本将查询指定的文件。时间步长为每5分钟一次,因此一小时内有12个文件 当一小时结束时,我如何停止下一个文件为0060并强制它为0100?我可以手动列出所有可能的时间变化(如0005、0010、0015等),但必须有更好的方法 用户正在以整数形式输入这些值
201705150000_*
201705150005_*
201705150010_*
201705150015_*
我正在编写一个脚本,用户将在其中输入开始时间和所需的持续时间,例如3小时。然后脚本将查询指定的文件。时间步长为每5分钟一次,因此一小时内有12个文件
当一小时结束时,我如何停止下一个文件为0060并强制它为0100?我可以手动列出所有可能的时间变化(如0005、0010、0015等),但必须有更好的方法
用户正在以整数形式输入这些值。您可以迭代这些值,并替换每个匹配行:
s = '201705150060_*'
if s.find('60',10) > 0: # checks 60 is a substring starting from location 10
s = s.replace('60', '100')
print(s)
如您所见,我有一个字符串
s
,它的末尾包含60
。我使用find
验证,然后将60
替换为100
。您只需要在循环中执行此操作,尽管我不确定这是否是python的方法(我很高兴听到更好的方法:)将日期时间字段的最后4
位数除以小时和分钟,以真正的方式转换它们并替换为原始字符串
def fixIt(s):
h, m = int(s[8:10]), int(s[10:])
h += m // 60
m = m % 60
return s[:8] + "{:02d}{:02d}".format(h, m)
{:02d}
是h
和m
的占位符,用于format()
函数,用于将h
和m
转换为字符串,每个字符串有2个字符(前面有0
,用于1位数字).我发现使用datetime模块用于此类目的总是很优雅的。例如,代码在任何持续时间内都是通用的
使用您的时间列表
file_times=["201705150000_","201705150005_","201705150010_","201705150015_"]
现在用datetime解析此列表以获得datetimelist
from datetime import datetime
datelist=[s.split('_')[0] for s in a]
datetimelist=[datetime.strptime(datei,"%Y%m%d%H%M") for datei in datelist]
strtime和格式就是诀窍
让我们编写一个简单函数,在给定用户时间的情况下,以相同的字符串格式和持续时间探测此列表中的时间
def probetimes(datetimelist,stime,duration_in_seconds):
starttime=datetime.strptime(stime,"%Y%m%d%H%M")
real_starttime=min(datetimelist,key=lambda t: abs(t - newdt)) # bisect.left can be faster
startind=datetimelist.index(real_starttime)
stoptime=starttime+timedelta(**{'seconds':duration_in_seconds})
try:
for current in datetimelist[startind:]:
if current<stoptime:
yield current.strftime('%Y%m%d%H%H')
except StopIteration:
pass #whatever you wants
好啊但是我必须指定0060
,因为60
可能在字符串的其他位置。同样适用于100
@DonkeyKong我不明白这个问题。您担心此替换会更改字符串中的其他“60”?抱歉,刚刚意识到10
是起始索引。我现在明白了,谢谢。@DonkeyKong请注意find方法有一个可以设置的begin和end参数,这样子字符串搜索就可以得到非常严格的边界:)
print(list(probetime(datetimelist,'201705150012',3600)))
['201705150000', '201705150000']