【问题标题】:Invalid argument when converting float to datetime将浮点数转换为日期时间时参数无效
【发布时间】:2017-03-29 16:49:40
【问题描述】:

我必须使用 Python 从浮点数中获取datetime。我正在尝试使用以下代码:

import time
print (time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(float(63650571169.50261))))

但是在执行这段代码时,我得到一个错误:

OSError: [Errno 22] Invalid argument

sys.float_info.max 显示 1.7976931348623157e+308

如何将此浮点数转换为datetime

【问题讨论】:

  • 该代码适用于 OS X 上的 Python 3.6.1,生成 3987-01-03 10:12:49
  • 您使用什么操作系统?在 Linux 上的 3.4.5 上为我工作,答案与上述相同。
  • 如果我们不能重现这个但你可以,你可能需要做一个 strace 来找出失败的系统调用。见IOError: [Errno 22] Invalid Argument with clock() being passed in
  • @MartijnPieters 初始测试,我可以部分在 Windows 上的 Python 2.7 中复制,ValueError: (22, 'Invalid argument')
  • @roganjosh:对于time.gmtime() 部分或time.strftime() 部分?

标签: python datetime time


【解决方案1】:

看起来您的操作系统正在使用 ISO 8601:2004 (clause 4.3.2.1 The Gregorian calendar) 和第 0 年的纪元。这可以通过应用正确的零偏移量进行转换:

代码:

import datetime as dt

# define some constants
epoch = dt.datetime(1970, 1, 1)
gregorian_8601_to_unix_epoch = 62167305600

def gregorian_8601_to_datetime(gregorian_8601_seconds):

    # get number of seconds from epoch
    from_epoch = gregorian_8601_seconds - gregorian_8601_to_unix_epoch

    # convert to python datetime
    return epoch + dt.timedelta(seconds=from_epoch)

测试代码:

print(gregorian_8601_to_datetime(63650571169.50261))

结果:

2017-01-01 10:12:49.502609

【讨论】:

  • 谢谢您的回复,其实datenum是毫秒数,datetime必须是2010-11-04到2011-06-11。日期时间示例:2010-11-04 00:03:50.209589。
  • 那么,您认为63650571169.50261 是从基准时间开始的毫秒数,它代表2010-11-04 到2011-06-11 之间的日期?这是极不可能的,因为这意味着纪元日期介于 2008-10-282009-06-04 之间。
  • 感谢您的回答@Stephan,对于简单的示例,它可以正常工作,但后来我想将它用作更大计算的函数,并且出现以下错误:OverflowError: Python int too large to convert to C长
  • @Amy21,感谢您的反馈。你最好的办法是提出一个新问题。请务必包含MCVE,如果需要,请提供指向此答案的链接。如果您希望我确定并看到它,您可以在此处发表另一条评论并附上新问题的链接。
【解决方案2】:

试试这个:

import datetime
print datetime.datetime.fromtimestamp(63650571169.50261)
#3987-01-03 05:12:49.502609

【讨论】:

  • 它不起作用,同样的错误仍然存​​在。我正在使用 Windows 7 64 位和 python 3.5 版
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2019-02-17
  • 2022-01-17
  • 2022-11-15
  • 2018-07-07
相关资源
最近更新 更多