【问题标题】:Working with time, date, timedelta使用时间、日期、时间增量
【发布时间】:2012-05-15 20:33:50
【问题描述】:

我有一个问题,我经常处理时间和时差问题。到目前为止,我已经使用许多 if 语句解决了这个问题,但这些很容易出错。在寻找更好的解决方案并且没有重新发明轮子的情况下,我遇到了时间、日期和时间增量。但是这些对我来说似乎太不灵活了,所以我正在寻找关于如何使用 python 的内置函数解决这个问题的想法和技巧——如果可能的话。这就是问题所在:将卫星数据从条带分格到常规网格涉及大量简单的时间计算。如果我有日期整数:200702100700 我想从这样的时间格式中添加和减去小时和分钟,这样 date - 18 会给我一个新的日期,它考虑到闰年并且可以向后交叉,年,月,日和前锋。以下是我对python的datetime包的理解:

from datetime import timedelta, date, time
t1 = date(2007,01,01); t = time(12,0); t2 = datetime.combine(t1,t)
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3
print t4
>>>datetime.timedelta(2006, 23401, 3001)

这个时间在一个会进行数千次计算的脚本中不是很有用。我的问题是 t4 没有年、月或日对象,并且 2006 似乎被视为小时。这一切都非常令人困惑。这在 python/numpy/scipy 中可能吗?如果是这样,有人可以给我小费吗?

【问题讨论】:

    标签: python datetime numpy scipy


    【解决方案1】:

    Gerrat 猜对了,使用 datetime 对象。

    您可以完全创建日期时间对象,而无需单独创建日期和时间(或使用datetime.strptime())。

    BUG ALERT 您的代码和一些已发布的回复将注入一个难以发现的错误。

    // this works
    datetime(2007,01,01,12)
    // this breaks
    datetime(2007,01,09,12)
    

    在python中,在代码中使用日期时,在“09”中键入“0”使其成为八进制数(“09”无效),避免前导零。

    【讨论】:

    • 不错的菲尔。在我自己的代码中,我通常不会在任何数字前面加上“0”,但并没有真正考虑这里的后果。
    • 好点!我会确保我避免这样做。通常,这种填充的主要原因是搜索文件字符串或创建这样的字符串。我的文件就是这样的。
    【解决方案2】:
    from datetime import datetime, timedelta, date, time
    t2 = datetime(2007, 1, 1, 12, 0, 0); 
    t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3
    print "YEAR", t4.year
    print "MONTH", t4.month
    print "DAY", t4.day
    print "HOUR", t4.hour
    print "MINUTE", t4.minute
    

    运行那个...

    [Mike_Pennington ~]$ python foo.py 
    YEAR 2006
    MONTH 12
    DAY 31
    HOUR 18
    MINUTE 0
    [Mike_Pennington ~]$
    

    【讨论】:

      【解决方案3】:

      您要使用的是日期时间对象,而不是日期对象:

      from datetime import datetime, timedelta
      t1 = datetime(2007, 01, 01)
      print t1 - timedelta(days=18)
      >>>datetime.datetime(2006, 12, 14, 0, 0)
      print t1 - timedelta(hours=18)
      >>>datetime.datetime(2006, 12, 31, 6, 0)
      

      这也适用于小时、分钟和秒!

      【讨论】:

        猜你喜欢
        • 2020-01-09
        • 2021-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多