【问题标题】:Leap year convention in python datetimepython datetime中的闰年约定
【发布时间】:2014-06-19 21:38:22
【问题描述】:

我正在读取时间变量用 udunits 编码的数据。这意味着时间变量是自 1-1-1 00:00:00 以来的小时数,但是,它不遵循标准的闰年约定。

我正在尝试将自 1-1-1 00:00:00 以来的小时数转换为 python datetime 对象,但由于 datetime 确实遵循闰年约定,最终得到了不正确的答案。例如:

t_data = 17584272    # This is time stamp for January 1st, 2007 in the data file
day = datetime.datetime(1,1,1) + datetime.timedelta(hours=t_data)
print(day)

结果:

>>> 2007-01-03 00:00:00

有没有办法在 python 日期时间中“关闭”闰年约定?

提前感谢您的帮助!

【问题讨论】:

  • datetime 中无法关闭闰年,但有一种方法可以更正您的时间戳。你能再举几个例子,尤其是那些分散几年的例子吗?
  • 简短的回答是否定的。不过,似乎确实有一些适用于 Python 的 udunits 接口,例如code.google.com/p/cfunits-python
  • 17584272.0/24.0/365.0 == 2007.34,这意味着如果没有闰日,日期应该是 2007 年的三分之一(即某个时候的四月)。
  • 你怎么知道那是 2007 年 1 月 1 日?
  • @MarkRansom 以下是更多示例:1/1/1990 = 1.7435256E7、1/1/1995 = 1.747908E7、1/1/2000 = 1.7522904E7、1/1/2013 = 1.763688 E7 谢谢!

标签: python datetime leap-year


【解决方案1】:

我认为您对闰年使用不当的评估是不正确的,您列出的所有样本都是一致的。您需要考虑一些偏移量。不必知道偏移量是多少,您只需从已知的日期和小时数开始。

def udtimestamp(hours):
    return datetime.datetime(1990,1,1) + datetime.timedelta(hours=hours-17435256)

>>> for x in (17584272,1.7435256E7,1.747908E7,1.7522904E7,1.763688E7):
    print udtimestamp(x)

2007-01-01 00:00:00
1990-01-01 00:00:00
1995-01-01 00:00:00
2000-01-01 00:00:00
2013-01-01 00:00:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2011-07-16
    • 2022-11-14
    • 2022-10-20
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多