Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.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_Date_Time - Fatal编程技术网

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']