【问题标题】:Round timestamp to nearest day in Python在 Python 中将时间戳舍入到最近的一天
【发布时间】:2013-11-12 03:49:57
【问题描述】:

在 Python 2.7.2 中,我得到了自纪元以来的秒数:

sec_since_epoch = (date_obj - datetime(1970, 1, 1, 0, 0)).total_seconds()

现在我想将这些秒数四舍五入到最近的一天,例如如果:

datetime.fromtimestamp(sec_since_epoch)

对应于datetime(2013, 12, 14, 5, 0, 0)

我希望新的时间戳对应datetime(2013, 12, 14, 0, 0, 0)

我知道这样做的丑陋方式,但有没有优雅的方式?

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    当然,只需先将datetime 转换为date

    sec_since_epoch = (date_obj.date() - date(1970, 1, 1)).total_seconds()
    

    当然date() 会截断。如果要在中午或中午之后四舍五入等,只需在截断前添加 12 小时,或检查日期是否 >= 同一天中午,如果是,则添加一天(请注意,这些可以在DST 边界天数),或任何您想要四舍五入的规则。

    【讨论】:

    • 如果我先做ts = (datetime(2013, 10, 31, 5, 0).date() - date(1970, 1, 1)).total_seconds(),然后再做datetime.fromtimestamp(ts),我仍然会得到datetime.datetime(2013, 10, 30, 17, 0),其中小时数不是0
    • @LymanZerga:时间戳是格林威治标准时间 2013 年 10 月 31 日午夜,这显然是您当地时区的 2013 年 10 月 30 日 17:00,这就是您所看到的。阅读有关原始日期时间对象的文档。
    【解决方案2】:

    您可以使用datetime.timetuple() 来操作日期。例如。这样:

    from datetime import datetime
    
    
    dt = datetime(2013, 12, 14, 5, 0, 0)
    dt = datetime(*dt.timetuple()[:3]) # 2013-12-14 00:00:00
    print dt.strftime('%s') # 1386997200
    

    DEMO

    【讨论】:

      【解决方案3】:

      这是一种非常直观的方法,它可能看起来有点野蛮,但它可以在一行中工作。

      基本上,逻辑是获取您当前的日期,然后减去您拥有的所有小时、分钟、秒和微秒,然后加上一天(如果您想向上取整,否则如果向下取整则保留它.)

         from datetime import date,timedelta
      
          Rounded_date =  ( the_date - timedelta(hours=date.hour, minutes=date.minute,
          seconds=date.second, microseconds=date.microsecond) ) + timedelta(days=1)
      

      【讨论】:

        猜你喜欢
        • 2021-05-07
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-02-04
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        相关资源
        最近更新 更多