该单位传递给熊猫的datetime64数据类型做什么?
请考虑以下代码:
import pandas as pd
v1 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64'})
v2 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[ns]'})
v3 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[ms]'})
v4 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[s]'})
v5 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[h]'})
v6 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[D]'})
v7 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[M]'})
v8 = pd.DataFrame({'Date':['2020-01-01']*1000}).astype({'Date':'datetime64[Y]'})
for v in [v1,v2,v3,v4,v5,v6,v7,v8]:
x = v.iloc[0,0]
print(x, type(x), x.to_datetime64(), v.memory_usage()['Date'])
它返回:
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
2020-01-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'> 2020-01-01T00:00:00.000000000 8000
发布于 2022-11-30 16:16:54
首先: Pandas版本的datetime64
类型只支持时区。具体来说,当您尝试在Pandas系列中使用datetime64
变体时,它只支持as
(阿秒)、fs
(飞秒)、ps
(皮秒)和ns
(纳秒)分辨率,任何不太精确的都会被datetime64[ns]
所取代。datetime64[<res>, <tz>]
变体只接受s
(秒)、ms
(毫秒)、us
(微秒)和ns
分辨率。不要把这些和numpy
datetime64 type混淆起来。
对于Pandas和Numpy,两个字母的缩写决定了用来记录时间戳的分辨率,而且由于类型总是以64位的形式存储,所以它决定了可以存储在其中的值的范围。它不会改变类型需要多少内存!
来自numpy datetime64
documentation
Datetime总是存储在1970-01-01T00:00的时代。这意味着支持的日期总是围绕着时代的对称间隔,在下表中称为“时间跨度”。
跨度的长度是64位整数的范围,乘以日期或单位的长度。例如,“W”(周)的时间跨度正好比“D”(天)的时间跨度长7倍,而“D”(day)的时间跨度正好是“h”(小时)的24倍。
你的实验不会显示内存使用上的任何不同,因为内存的数量不会改变,只有分辨率。
因为Pandas封装了numpy datetime64
类型,所以实际上不能用datetime64[ns]
以外的任何东西创建一个系列;例如,DateTimeIndex
dtype
parameter被记录为接受numpy.dtype
、DatetimeTZDtype
或str
__,默认None
,但是对于numpy.dtype
,还有一个额外的限制:
注意,唯一允许的NumPy dtype是‘datetime64ns’。
因此,要演示不同单元的效果,必须直接使用numpy
类型:
>>> import numpy as np
>>> for unit in ('Y', 'M', 'W', 'D', 'h', 'm', 's', 'ms', 'us', 'ns'): # ps, fs and as have too small a span
... print(unit, np.array(["2021-02-27T12:24:17.524627869"], dtype=f"datetime64[{unit}]"))
...
Y ['2021']
M ['2021-02']
W ['2021-02-25']
D ['2021-02-27']
h ['2021-02-27T12']
m ['2021-02-27T12:24']
s ['2021-02-27T12:24:17']
ms ['2021-02-27T12:24:17.524']
us ['2021-02-27T12:24:17.524627']
ns ['2021-02-27T12:24:17.524627869']
Note:Pandas的文档只讨论过datetime64
类型的ns
解析,从GitHub上的各种问题中可以看出,虽然一些代码库支持其他(更精细)的解决方案,但库中的所有内容都不可靠或广泛支持这种支持。你的里程可能会不同。
https://stackoverflow.com/questions/74630783
复制相似问题