我有一个熊猫时间戳记,我想将其转换为字符串表示形式,作为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
这是熊猫时间戳的预期行为吗?如果没有,那我可能做错了什么?
答案 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'
通过堆栈溢出学习