Python 熊猫:第一个datetime字段自动转换为时间戳类型

Python 熊猫:第一个datetime字段自动转换为时间戳类型,python,datetime,pandas,dataframe,Python,Datetime,Pandas,Dataframe,创建pandas数据帧对象(python 2.7.9,pandas 0.16.2)时,第一个datetime字段会自动转换为pandas时间戳。为什么?是否可以防止这种情况发生,以保持字段为原始类型 请参阅下面的代码: import numpy as np import datetime import pandas 创建一个dict: x = {'cusip': np.array(['10553M10', '67085120', '67085140'], dtype='|S8'),

创建pandas数据帧对象(python 2.7.9,pandas 0.16.2)时,第一个datetime字段会自动转换为pandas时间戳。为什么?是否可以防止这种情况发生,以保持字段为原始类型

请参阅下面的代码:

import numpy as np
import datetime
import pandas
创建一个dict:

x = {'cusip': np.array(['10553M10', '67085120', '67085140'], dtype='|S8'), 

     'vstart':np.array([datetime.datetime(2001, 11, 16, 0, 0),
     datetime.datetime(2012, 2, 28, 0, 0), datetime.datetime(2014, 12, 22, 0, 0)], 
     dtype=object), 

     'vstop': np.array([datetime.datetime(2012, 2, 28, 0, 0), 
     datetime.datetime(2014, 12, 22, 0, 0), datetime.datetime(9999, 12, 31, 0, 0)], 
     dtype=object), 

     'id': np.array(['EQ0000000000041095', 'EQ0000000000041095', 'EQ0000000000041095'], 
     dtype='|S18')}
因此,到目前为止,vstart和vstop键都是datetime。但是,在:

df = pandas.DataFrame(data = x)
vstart将自动成为时间戳,而vstop将保持为datetime

type(df.vstart[0])
#class 'pandas.tslib.Timestamp'
type(df.vstop[0])
#type 'datetime.datetime'

我不明白为什么构造函数遇到的第一个datetime列会被pandas转换为Timestamp。以及如何告诉pandas保持数据类型不变。你能帮忙吗?谢谢。

事实上,我注意到您的数据中有一些东西,它与您的列中的第一个或第二个日期列无关
vstop
有一个datetime值
dt.datetime(9999,12,31,0,0)
,如果您将此日期的年份更改为正常年份,例如
2020
,则两列将被视为相同的

请注意,我正在将
datetime
模块导入为
dt

x = {'cusip': np.array(['10553M10', '67085120', '67085140'], dtype='|S8'), 
     'vstop': np.array([dt.datetime(2012, 2, 28, 0, 0), dt.datetime(2014, 12, 22, 0, 0), dt.datetime(2020, 12, 31, 0, 0)], dtype=object),
     'vstart': np.array([dt.datetime(2001, 11, 16, 0, 0),dt.datetime(2012, 2, 28, 0, 0), dt.datetime(2014, 12, 22, 0, 0)], dtype=object), 
     'id': np.array(['EQ0000000000041095', 'EQ0000000000041095', 'EQ0000000000041095'], dtype='|S18')}

In [27]:
df = pd.DataFrame(x)
df
Out[27]:
cusip                   id          vstart  vstop
10553M10    EQ0000000000041095  2001-11-16  2012-02-28
67085120    EQ0000000000041095  2012-02-28  2014-12-22
67085140    EQ0000000000041095  2014-12-22  2020-12-31

In [25]:
type(df.vstart[0])
Out[25]:
pandas.tslib.Timestamp

In [26]:
type(df.vstop[0])
Out[26]:
pandas.tslib.Timestamp

非常感谢。这似乎解决了问题。