为什么pandas系列会将我的numpy datetime64数组的元素作为时间戳返回?

时间:2014-02-24 13:31:19

标签: python datetime numpy pandas

我有一个大熊猫系列,可以像下面那样构建:

given_time = datetime(2013, 10, 8, 0, 0, 33, 945109, 
        tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, name=None))
given_times = np.array([given_time] * 3, dtype='datetime64[ns]'))
column = pd.Series(given_times)

我的系列dtypedatetime64[ns]

但是,当我访问它时:column[1],它会变成类型pandas.tslib.Timestamp,而column.values[1]会保持np.datetime64。在访问该项目时,Pandas会自动将datetime投射到Timestamp吗?这很慢吗?

我是否需要担心类型的差异?据我所知,Timestamp似乎没有时区(numpy.datetime64('2013-10-08T00:00:33.945109000+0100') -> Timestamp('2013-10-07 23:00:33.945109', tz=None)

在实践中,我会做datetime算术,比较差异,与datetimedelta进行比较。我的操作符可能的类型不一致是否会影响我的用例?

此外,我鼓励在转换日期时间对象时使用pd.to_datetime而不是astype(dtype='datetime64')吗?

2 个答案:

答案 0 :(得分:2)

Pandas时间类型建立在numpy的datetime64之上。

为了继续使用pandas运算符,您应该继续使用pd.to_datetime,而不是astype(dtype='datetime64')。这尤其如此,因为您将采用日期时间增量,这些增量处理令人钦佩,例如重新采样和周期定义。

http://pandas.pydata.org/pandas-docs/stable/timeseries.html#up-and-downsampling http://pandas.pydata.org/pandas-docs/stable/timeseries.html#period

虽然我没有测量过,但由于大熊猫时代隐藏了多次,我怀疑转换速度非常快。或者,您可以使用内置于时间序列定义中的pandas,并完全避免转换。

根据经验,最好使用您将使用函数的包中的类型。因此,如果你真的只是使用numpy来操作数组,那么坚持使用numpy日期时间。熊猫方法=>熊猫约会时间。

答案 1 :(得分:0)

我在文档中读过(道歉,无法找到链接)标量值将转换为时间戳,而数组将保留其数据类型。例如:

from datetime import date
import pandas as pd
time_series = pd.Series([date(2010 + x, 1, 1) for x in range(5)])
time_series = time_series.apply(pd.to_datetime)

这样:

In[1]:time_series
Out[1]: 
0   2010-01-01
1   2011-01-01
2   2012-01-01
3   2013-01-01
4   2014-01-01
dtype: datetime64[ns]

然而:

In[2]:time_series.iloc[0]
Out[2]:Timestamp('2010-01-01 00:00:00')

,同时:

In[3]:time_series.values[0]
In[3]:numpy.datetime64('2009-12-31T19:00:00.000000000-0500')

因为iloc从pandas请求标量(类型转换为Timestamp),而值请求完整的numpy数组(没有类型转换)。

长度为一系列的行为类似。另外,引用切片中的多个元素(即iloc [1:10])将返回一个序列,该序列将始终保持其数据类型。

我不确定为什么pandas会这样做。

In[4]: pd.__version__
Out[4]: '0.15.2'