【问题标题】:Timestamp formatting in pythonpython中的时间戳格式
【发布时间】:2021-06-11 14:39:01
【问题描述】:

我有以下格式的时间戳 - 21 年 6 月 6 日星期五晚上 11:11:11.402

我想做两件事-

  1. 在 6Jun21 之前添加进程 0,使其读取为 06Jun21,并忽略 出现两位数
  2. 将时间转换为 24 小时制

最终输出应如下所示 21 年 6 月 6 日星期五 23:11:11.402

我尝试了传统格式但无法这样做。我试图避免解析为正则表达式并增加我的处理开销。

有什么想法吗?

【问题讨论】:

  • 为什么不首先正确生成时间戳?或者,如果你不能因为一些想象中的减速而避免使用正则表达式,这似乎是为自己做更多的工作;为什么不尝试使用正则表达式,也许它不会使您的代码减慢太多,如果确实如此,那么请寻找一种更快的实现方式。
  • 在我看来,6 月 6 日是星期日,而不是星期五?

标签: python datetime timestamp


【解决方案1】:

您可以尝试这样的正则表达式 - 我已经包含了一个 timeit,因此您可以查看每次修改需要多长时间。

import re

ts = "Fri 6Jun21 11:11:11.402 pm"

def modifytimestamp(ts):
    tsre = r"^(\S+ )(\d+)(\S+ )(\d+)(:\d+:\d+\.\d+) ((p|a)m)"
    matches = re.match(tsre,ts)

#    for g in matches.groups():
#        print( f"{g=}" )
        
    monthday = int(matches.group(2))
    monthday = str(monthday) if monthday >9 else "0"+str(monthday)
    hour = int(matches.group(4))
    ampm = matches.group(6)
    if ampm == 'pm':
        hour += 12
    hour=str(hour)
    # re-assemble the poissibly-modifed timestamp
    result = matches.group(1)+monthday+matches.group(3)+hour+matches.group(5)
    return result

if __name__=='__main__':
    result = modifytimestamp(ts)
    print( f"{result=}" )

    import timeit
    repeats=1000000
    totaltime = timeit.timeit(stmt='modifytimestamp("Fri 6Jun21 11:11:11.402 pm")',globals=globals(),number=repeats)
    print( f"{totaltime=} for {repeats} iterations" )
  

结果:

result='Fri 06Jun21 23:11:11.402'
totaltime=3.5960077 for 1000000 iterations

因此修改时间戳需要 3.6 微秒(在我的笔记本电脑上,CoreI7 或其他)

我没有预编译正则表达式,也没有以任何方式进行优化——你可以通过一些简单的优化将这个时间减半。是的,其他分离字符串的方法可能要快得多,但这可能足以不会过多地减慢您的其他代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2013-01-19
    • 1970-01-01
    • 2019-12-25
    • 2018-12-07
    • 2011-12-04
    • 1970-01-01
    • 2015-05-12
    相关资源
    最近更新 更多