python:将pywintyptes.datetime转换为datetime.datetime

Nat*_*ens 4 python excel pywin32

我正在使用pywin32读取/写入Excel文件。我在Excel中有一些日期,格式为yyyy-mm-dd hh:mm:ss。我想将它们作为datetime.datetime对象导入Python。这是我开始的代码行:

prior_datetime = datetime.strptime(excel_ws.Cells(2, 4).Value, '%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

那没用。我得到了错误:

strptime() argument 1 must be str, not pywintypes.datetime
Run Code Online (Sandbox Code Playgroud)

我尝试将其转换为字符串,如下所示:

prior_datetime = datetime.strptime(str(excel_ws.Cells(2, 4).Value), '%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

那也不起作用。我得到了错误:

ValueError: unconverted data remains: +00:00
Run Code Online (Sandbox Code Playgroud)

因此,我尝试了一些不同的方法:

prior_datetime = datetime.fromtimestamp(int(excel_ws.Cells(2, 4).Value))
Run Code Online (Sandbox Code Playgroud)

仍然没有运气。错误:

TypeError: a float is required.
Run Code Online (Sandbox Code Playgroud)

投向浮动广告并没有帮助。也不是整数。(嘿,我当时很绝望。)

我可能在找错地方,但是我在查找有关pywin32的任何常规文档(尤其是pywintypes或pywintypes.datetime)方面的良好文档时遇到了麻烦。

有什么帮助吗?

Mal*_*ton 8

我认为你与 . 的关系非常密切datetime.datetime.fromtimestamp。一直采用这种方法,您可以pywintypes.datetime使用其方法将对象转换为时间戳timestamp。为了确保时区安全,还可以使用该tzinfo属性。请参阅In [4]:下面的完整语法。

当我尝试从 Excel 书的几行中创建 pd.DataFrame 时,我刚刚遇到了同样的问题。我不断收到这个可怕的“Python 已停止工作”对话框。

In [1]: pywindt
Out[1]: pywintypes.datetime(2018, 9, 13, 14, 2, 24, tzinfo=TimeZoneInfo('GMT Standard Time', True))

In [2]: str(pywindt)
Out[2]: '2018-09-13 14:02:24+00:00'

In [3]: # Conversion takes place here!

In [4]: dt = datetime.datetime.fromtimestamp(
   ...:     timestamp=pywindt.timestamp(),
   ...:     tz=pywindt.tzinfo
   ...: )

In [5]: dt
Out[5]: datetime.datetime(2018, 9, 13, 14, 2, 24, tzinfo=TimeZoneInfo('GMT Standard Time', True))

In [6]: str(dt)
Out[6]: '2018-09-13 14:02:24+00:00'
Run Code Online (Sandbox Code Playgroud)

作为后续,如果您需要检查单元格值是否是 pywintypes 日期时间,以下内容应该足够了。

In [7]: import pywintypes

In [8]: isinstance(pywindt, pywintypes.TimeType)
Out[8]: True

In [9]: # just out of curiousity

In [10]: isinstance(dt, pywintypes.TimeType)
Out[10]: False
Run Code Online (Sandbox Code Playgroud)


Ale*_*sen 5

所以问题是+00:00时区偏移量。考虑到这一点,没有针对Python的即用型解决方案

datetime.datetime.strptime("2016-04-01 17:29:25+00:00", '%Y-%m-%d %H:%M:%S %z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/_strptime.py", line 324, in _strptime
    (bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'
Run Code Online (Sandbox Code Playgroud)

一种创可贴解决方案是剥离时区,但感觉很糟糕。

datetime.datetime.strptime("2016-04-01 17:29:25+00:00".rstrip("+00:00"), '%Y-%m-%d %H:%M:%S')
datetime.datetime(2016, 4, 1, 17, 29, 25)
Run Code Online (Sandbox Code Playgroud)

环顾四周看起来(如果可以使用第三方库)dateutil可以解决此问题,然后使用会更好datetime.strptime

在命令行上

pip install python-dateutil
Run Code Online (Sandbox Code Playgroud)

>>> import dateutil.parser                                                      
>>> dateutil.parser.parse("2016-04-01 17:29:25+00:00")
datetime.datetime(2016, 4, 1, 17, 29, 25, tzinfo=tzutc())
Run Code Online (Sandbox Code Playgroud)