我有一个像下面这样的熊猫df,其中Time Block
索引列和Payload
列是一个int:
Payload
Time Block
2021-08-20 00:00:00 1
2021-08-20 00:15:00 2
2021-08-20 00:30:00 3
2021-08-20 00:45:00 4
2021-08-20 01:00:00 5
熊猫到json,它似乎会自动转换为纪元时间:
result = df.to_json(orient="index")
看起来像这样:
'{"1629417600000":{"Payload":1},"1629418500000":{"Payload":2},"1629419400000":{"Payload":3},"1629420300000":{"Payload":4},"1629421200000":{"Payload":5}}`
解析json数据:
import json
parsed = json.loads(result)
看起来像这样:
{'1629417600000': {'Payload': 1},
'1629418500000': {'Payload': 2},
'1629419400000': {'Payload': 3},
'1629420300000': {'Payload': 4},
'1629421200000': {'Payload': 5}}
我不能弄清楚的是我如何将原始的时间块列转换回datetime?
例如,第一个日期是1629417600000,如果我尝试:
from datetime import datetime
epoch_time = 1629417600000
datetime_time = datetime.fromtimestamp(epoch_time)
这将抛出错误OSError: [Errno 22] Invalid argument
有什么应该做的熊猫时间块列json数据解析后?
如果我这样做:
import time
time.time()
如下所示,与pandas将日期时间索引打包为json的方式有点不同:
1629571434.5085876
time.time()也可以很好地解析,如下所示。
epoch_time = time.time()
datetime_time = datetime.fromtimestamp(epoch_time)
任何提示都非常感谢。这几乎就像我需要将我的熊猫纪元值除以1000,但我不完全确定纪元时间是如何计算的,以知道这是否可行。
函数fromtimestamp
以秒为输入,而您提供的是毫秒。
除以1000正是你需要做的(并且将根据需要工作)。但是,您可能需要使用utcfromtimestamp
函数来代替:
fromtimestamp
给出本地时间的日期和时间utcfromtimestamp
给出UTC的日期和时间。
from datetime import datetime
>>> [datetime.utcfromtimestamp(int(ts)/1000) for ts in parsed]
[datetime.datetime(2021, 8, 20, 0, 0),
datetime.datetime(2021, 8, 20, 0, 15),
datetime.datetime(2021, 8, 20, 0, 30),
datetime.datetime(2021, 8, 20, 0, 45),
datetime.datetime(2021, 8, 20, 1, 0)]