首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >该单位传递给熊猫的datetime64数据类型做什么?

该单位传递给熊猫的datetime64数据类型做什么?
EN

Stack Overflow用户
提问于 2022-11-30 16:04:58
回答 1查看 48关注 0票数 -2

该单位传递给熊猫的datetime64数据类型做什么?

请考虑以下代码:

代码语言:javascript
运行
复制
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'])

它返回:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.dtypeDatetimeTZDtypestr__,默认None,但是对于numpy.dtype,还有一个额外的限制:

注意,唯一允许的NumPy dtype是‘datetime64ns’。

因此,要演示不同单元的效果,必须直接使用numpy类型:

代码语言:javascript
运行
复制
>>> 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上的各种问题中可以看出,虽然一些代码库支持其他(更精细)的解决方案,但库中的所有内容都不可靠或广泛支持这种支持。你的里程可能会不同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74630783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档