首页 > 解决方案 > 为什么熊猫数据框 tolist 将日期时间作为值返回

问题描述

所以我有这个熊猫数据框,我想保存在 postgres 数据库中。我想将日期时间保留为带有时区的时间戳。

df.set_index(['datetime', 'area_id'], inplace=True)
df = df.tz_localize('Asia/Tokyo', level=0)
df.reset_index(inplace=True)
print(df[0].values)

我得到

[时间戳('2018-04-01 00:00:00+0900', tz='亚洲/东京') 1 1 3000.0]

但是,当我这样做时,即使我想要日期时间,数据框也会变成值。我想要什么 [('2018-04-01 00:00:00+0900',1, 1, 3000.0)]

但是,当我运行此代码时

d = list(zip(*[df[c].values.tolist() for c in df])
print(d)

我得到值而不是日期时间。

(1522508400000000000, 1, 1, 3000.0)

到目前为止我所尝试的。

df['datetime']=df['datetime'].dt.to_pydatetime()

但它没有用。我发现这个解决方案Pandas DataFrame Date Series to List conversion 但对我来说没有帮助。它只显示一个特定的列,而我想对所有列都这样做。

标签: python-3.xpandasdatetime

解决方案


没有关于数据框是什么样子的任何信息,并假设输出需要是一个元组列表并且元组的datetime一部分实际上需要是datetime

import numpy as np
import pandas as pd
from datetime import datetime

df = pd.DataFrame({'a':[1,2,3],
                   'b':['foo','bar','foobar'],
                   'dt_var':np.array(['2018-01-01T12:00', '2018-02-03T00:00:01', '1018-09-01T15:15'], dtype='datetime64')})
s = df['dt_var'].dt.to_pydatetime()
cols_to_zip = list(df.columns.values)
cols_to_zip.remove('dt_var')


d = [(*x,y) for x in df[cols_to_zip].values for y in s ]

print(type(d[0][2]))
<class 'datetime.datetime'>

不过,我仍然会使用 John Zwinck 的答案 - 如果需要,可以将它们制作成字符串并在之后重新转换它们。


推荐阅读