使用strftime()将熊猫时间戳转换为POSIX纪元时间

时间:2020-06-17 23:20:32

标签: python pandas

我有一个熊猫时间戳记,我想将其转换为字符串表示形式,作为POSIX纪元时间戳记。我可以制作时间戳记,并通过以下几种方法进行检查:

>>> import pandas as ps
>>> ts = ps.Timestamp("2020-06-16 07:00:00-04:00")
>>> ts
Timestamp('2020-06-16 07:00:00-0400', tz='pytz.FixedOffset(-240)')
>>> ts.timestamp()
1592305200.0
>>> ts.value
1592305200000000000

该值将检出:

$ TZ=EST5EDT date -d @1592305200 -Iseconds
2020-06-16T07:00:00-04:00

但是,如果我尝试将该值格式化为字符串,那我会感到很奇怪:

>>> ts.strftime("%s")
'1592319600'

该值应该与任何时区无关,这是不正确的。

$ TZ=EST5EDT date -d @1592319600 -Iseconds
2020-06-16T11:00:00-04:00

这是熊猫时间戳的预期行为吗?如果没有,那我可能做错了什么?

1 个答案:

答案 0 :(得分:0)

要回答您的问题,应该使用Pandas Timestamp的行为。但是,使用小写%s可能会产生非常出乎意料的结果,因此不建议使用。我将在下面提供一些见解。

解决方案的背景

使用datetime时,Python实际上会调用平台C库的strftime()函数。因此,格式代码可能会因平台而异。重要的是要注意,Python %s不支持小写strftime(),如documentation所示。之所以起作用,是因为平台功能可能支持它。在某些平台上,%s returns是自1970年1月1日00:00:00 +0000(UTC)以来的秒数,但使用您的 local 时间区域而不是Timestamp中指定的区域。使用%s将在我的时区中产生完全不同的值。总而言之,请勿使用 .strftime("%s),因为它可能会导致一些非常意外的结果。

>>> import pandas as pd
>>> ts = pd.Timestamp("2020-06-16 07:00:00-0400")
>>> ts.strftime("%s %z")
Out: '1592290800 -0400'
>>> ts = pd.Timestamp("2020-06-16 07:00:00")
>>> ts.strftime("%s %z")
Out: '1592290800 '

解决方案

如果您想将Timestamp作为字符串,则可以使用

>>> "%d" % ts.timestamp()
Out: '1592305200'

通过堆栈溢出学习