2017-08-09 86 views
0

我正在构建一个交易策略回溯测试,它以存储日期作为索引。有人可以解释日期的以下类型数据的差异(以及进行赋值时的可变性)吗?不同类型的熊猫和python中的日期类型

a=pd.date_range('1/1/2016',periods=10,freq='w') 
b=datetime.datetime(2016,1,4) 
c=pd.datetime(2016,1,4) 
d=pd.Timestamp(153543453435) 

当我打印出来,数据类型如下:

<class 'pandas.core.indexes.datetimes.DatetimeIndex'> (print(type(a)) 
<class 'pandas._libs.tslib.Timestamp'> (print(type(a[0])) 
<class 'datetime.datetime'> 
<class 'datetime.datetime'> 
<class 'pandas._libs.tslib.Timestamp'> 

这将是巨大的,如果有人能在细节他们的差异和可变性做变量赋值时,解释一下吗?

回答

3
dti = pd.date_range('1/1/2016',periods=10,freq='w') 

根据the docsDatetimeIndex是:

不可变 ndarray datetime64数据的,内部表示为Int64类型,并且可以盒装到是日期时间的子类和携带元数据,如时间戳对象频率信息。

ts = dti[0] 

此外,熊猫Timestamp对象被设计为不可变的:

ts # returns Timestamp('2016-01-03 00:00:00', freq='W-SUN') 
ts.replace(year=2015) # returns Timestamp('2015-01-03 00:00:00', freq='W-SUN') 
ts # returns Timestamp('2016-01-03 00:00:00', freq='W-SUN') 

原帖由Timestamp对象的年份没怎么改变。取而代之的是替换方法返回一个新的Timestamp对象。

最后,相对于天然蟒datetime目的,根据the python docs

这些类型的对象是不可变的。

这里是关于在代表日期时间的不同类型之间转换的good SO post

那么,为什么你会使用一个而不是另一个?

datetimes可能是一个痛苦的工作。这就是为什么熊猫创建了自己的包装类(Timestamp)。元数据存储在这些对象上,使他们的操作更容易。 DatetimeIndex只是numpy datetime64对象的序列,这些对象被装箱到Timestamp对象中以实现附加功能。例如使用Timestamp/DatetimeIndex您可以:

  • 添加一定数量的工作日到datetimeindex。
  • 创建跨越特定周数的序列。
  • 更改时区。

所有这些事情是没有额外的方法和元数据存储在TimestampDatetimeIndex类皇家疼痛。

查看pandas docs获取更多示例。