【问题标题】:Pandas to_dict() converts datetime to TimestampPandas to_dict() 将日期时间转换为时间戳
【发布时间】:2021-01-18 02:58:06
【问题描述】:

在我的 pandas DataFrame 中,我使用 datetime 模块将一些日期值从时间戳转换为日期时间。打印出 DataFrame 看起来不错,但是当我使用 to_dict() 将 DataFrame 转换为字典时,日期时间值似乎是 pandas Timestamp 类型。

我的问题类似于this question,但我一开始没有pandas Timestamp 对象,我想保留我最初创建的datetime。建议的解决方案也对我不起作用,因为输出仍然是 pandas Timestamp,但 dtype object

输入:

import pandas as pd
from datetime import datetime

list_in = [
    {"name": "a", "created": 1574947970000}, 
    {"name": "b", "created": 1581322065000}, 
    {"name": "c", "created": 1578929177000}
]

然后我创建一个 DataFrame 并将每个时间戳转换为 datetime 格式。 (除以 1000 是必要的,因为时间戳是以毫秒为单位的,应该是秒)

df = pd.DataFrame(list_in)
df["created"] = [datetime.fromtimestamp(x / 1000) for x in df["created"]]
print(df)

输出:

  name             created
0    a 2019-11-28 14:32:50
1    b 2020-02-10 09:07:45
2    c 2020-01-13 16:26:17
name               object
created    datetime64[ns]
dtype: object

此输出将正确的日期值显示为日期时间对象。在我的项目中,我在 DataFrame 上做了一些与本主题无关的其他魔法。但最后我想将 DataFrame 转换回这样的字典列表:

list_out = df.to_dict(orient="records")

最终输出:

[{'name': 'a', 'created': Timestamp('2019-11-28 14:32:50')}, 
{'name': 'b', 'created': Timestamp('2020-02-10 09:07:45')}, 
{'name': 'c', 'created': Timestamp('2020-01-13 16:26:17')}]

最终期望的输出:

[{'name': 'a', 'created': datetime.datetime(2019, 11, 28, 14, 32, 50)}, 
{'name': 'b', 'created': datetime.datetime(2020, 2, 10, 9, 7, 45)}, 
{'name': 'c', 'created': datetime.datetime(2020, 1, 13, 16, 26, 17)}]

所以我的问题实际上是,为什么to_dict()datetime 值作为熊猫Timestamp 对象返回?我怎样才能防止这种情况发生?

【问题讨论】:

    标签: python pandas dataframe datetime timestamp


    【解决方案1】:

    为什么可以找到here

    我不知道如何防止它发生,但您可以将时间戳转换为 datetime64 之后:

    for rec in list_out:
        rec['created'] = rec['created'].to_datetime64()
    

    【讨论】:

    • 谢谢@Martin。我改用.to_pydatetime(),因为您的解决方案返回一个numpy.datetime64,而不是datetime.datetime
    • 嗨@Martin,我不确定时间戳文档页面如何解释“为什么”会发生这种情况。对此有何见解?
    • 我想我指的是“Timestamp 是 python 的 Datetime 的 pandas 等价物,在大多数情况下可以与它互换。”但这并不能真正解释为什么它会被to_dict 转换。我真的不记得了
    • 好的,感谢您的回答,您的提议确实有效,但如果有人找到更优雅的答案,我很想听听!
    猜你喜欢
    • 2016-10-05
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2022-01-08
    相关资源
    最近更新 更多