我有一个大熊猫系列,可以像下面那样构建:
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)
我的系列dtype
为datetime64[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')
吗?
答案 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'