我正在制定一个交易策略回溯测试,它与将日期存储为索引有关。有人可以解释日期的以下类型数据的差异(以及分配时的可变性)吗?
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'>
如果有人能够详细解释他们的差异以及进行变量分配时的可变性,那会很棒吗?
答案 0 :(得分:3)
dti = pd.date_range('1/1/2016',periods=10,freq='w')
根据the docs DatetimeIndex
是:
不可变日期时间64数据的ndarray,内部表示为int64,可以装入作为datetime子类的Timestamp对象,并携带频率信息等元数据。
ts = dti[0]
此外,pandas 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
对象的年份未发生变化。相反,replace方法返回了一个新的Timestamp
对象。
最后,关于本地python datetime
对象,根据the python docs:
这些类型的对象是不可变的。
这是关于在表示日期时间的不同类型之间进行转换的good SO post。
那么你为什么要使用一个而不是另一个呢?
datetimes
可能会很痛苦。这就是为什么pandas创建了自己的包装类(Timestamp
)。元数据存储在这些对象上,使操作更容易。 DatetimeIndex
只是一系列numpy datetime64
个对象,它们被添加到Timestamp
个对象中以增加功能。例如,您可以使用Timestamp
/ DatetimeIndex
:
如果没有Timestamp
和DatetimeIndex
类中存储的额外方法和元数据,所有这些都将是一种巨大的痛苦。
请查看pandas docs了解更多示例。