为什么Pandas DataFrame列出返回日期时间作为值

时间:2018-09-25 11:41:11

标签: python-3.x pandas datetime

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

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)

我得到

  

[Timestamp('2018-04-01 00:00:00 + 0900',tz ='Asia / Tokyo')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 但这对我的情况没有帮助。它只显示一个特定的列,而我想为所有列都做。

2 个答案:

答案 0 :(得分:0)

您需要先将日期列转换为字符串:

df['datetime'] = df['datetime'].apply(str)

然后:

df.values.tolist()

答案 1 :(得分:0)

在没有有关数据帧外观的任何信息的情况下,并假设输出需要为元组列表,并且元组的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的答案-将它们制成字符串,并在需要后将其重新转换。