Pandas中datetime64数据类型的传入单位是否起作用?
Pandas中datetime64单位参数的实际作用
在Pandas中使用astype("datetime64[xxx]")转换字符串日期时,测试发现不同单位参数下,生成的Timestamp类型、时间值及内存占用均无差异,以下是该单位参数的实际作用说明:
测试代码
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
单位参数的实际作用
- 仅对数值型时间戳生效:当输入是整数/数值形式的时间戳时,单位参数会决定数值对应的时间基准。比如数值
1609459200,用astype("datetime64[s]")会解析为2020-01-01,而用astype("datetime64[ms]")则会解析为1970-01-20 03:14:19.200。 - 字符串日期输入会忽略单位:Pandas处理字符串日期时,会直接解析为内部统一以纳秒精度存储的
Timestamp对象,此时指定的datetime64单位会被覆盖,所以测试中所有情况的结果一致。 - numpy层面的差异:如果直接用numpy创建
datetime64数组,不同单位会影响存储精度和内存占用(比如datetime64[D]比datetime64[ns]占用内存少很多),但Pandas会将这类numpy数组转换为Timestamp对象,统一为纳秒精度。 - 与
pd.to_datetime()的unit参数一致:在pd.to_datetime()中指定unit参数,作用和astype里的单位参数相同,都是用来解析数值型时间戳的基准单位。
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

