pandas 在panda中传递给datetime64数据类型的单元有什么作用吗?

ut6juiuv  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(205)

在panda中传递给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
lf5gs5x2

lf5gs5x21#

首先是: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 * 日期时间单位 * 文件:
日期时间始终以1970-01- 01 T00:00的历元存储。这意味着支持的日期始终是围绕历元的对称间隔,在下表中称为“时间跨度”。
跨度的长度是64位整数乘以日期或单位长度的范围。例如,'W'(周)的时间跨度正好是'D'(天)的时间跨度的7倍,'D'(天)的时间跨度正好是'h'(小时)的时间跨度的24倍。
您的实验不会显示内存使用方面的任何差异,因为内存量没有变化,只有分辨率发生了变化。
因为Pandas * Package 了 * numpy datetime64类型,并且你实际上不能用datetime64[ns]以外的任何东西创建一个系列;例如,DateTimeIndexdtype参数被记录为接受 * numpy.dtypeDatetimeTZDtypestr,默认为None *,但是对于numpy.dtype存在附加限制:
请注意,唯一允许的NumPy dtype是“datetime 64 [ns]”。
所以要演示不同单位的效果是什么,你就得直接使用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']

注意:Pandas的 * 文档 * 只讨论了datetime64类型的ns分辨率,从GitHub上的各种问题来看,虽然一些代码库支持其他(更好的)分辨率,但这种支持并不可靠,也没有得到库中所有代码的广泛支持。

相关问题