You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Pandas列存储numpy datetime64[D]而非datetime64[ns]类型

问题描述

我编写了如下代码:

dates = data['InvoiceDate'].unique()
c = data['StockCode'].unique()
r = pd.DataFrame([[dates], [c]]).T
r.columns=['InvoiceDate', 'StockCode']
r = r.explode(column='InvoiceDate')
r = r.explode(column='StockCode').reset_index(drop=True)
new_data = pd.merge(r, data, how='left', on=['InvoiceDate', 'StockCode'])
new_data['Quantity'] = new_data['Quantity'].fillna(0)
new_data['new_invoice'] = np.array(new_data['InvoiceDate'], dtype='datetime64[D]')
new_data.info()

我希望将new_invoice列的数据类型指定为datetime64[D],但似乎并未生效。运行代码后得到如下输出:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1241350 entries, 0 to 1241349
Data columns (total 5 columns):
 #   Column       Non-Null Count    Dtype         
---  ------       --------------    -----         
 0   InvoiceDate  1241350 non-null  datetime64[ns]
 1   StockCode    1241350 non-null  object        
 2   Quantity     1241350 non-null  float64       
 3   UnitPrice    280451 non-null   float64       
 4   new_invoice  1241350 non-null  datetime64[ns]
dtypes: datetime64[ns](2), float64(2), object(1)
memory usage: 56.8+ MB

执行new_data['new_invoice'][0]得到的结果是:

Timestamp('2010-12-01 00:00:00')

而我期望得到的结果是:

numpy.datetime64('2010-12-01')
解决方案

问题出在Pandas的默认行为上:当你将numpy.datetime64数组赋值给DataFrame列时,Pandas会自动将其转换为内部的Timestamp类型,并统一显示为datetime64[ns]的 dtype,即使你指定了datetime64[D]。

要实现需求,有两种可行方法:

方法1:存储原生numpy datetime64对象

如果需要列中实际存储numpy.datetime64类型对象,需要将列的 dtype 设置为object:

# 先转换为numpy datetime64[D]数组
date_array = np.array(new_data['InvoiceDate'], dtype='datetime64[D]')
# 赋值时转为object类型存入DataFrame
new_data['new_invoice'] = date_array.astype(object)

此时执行new_data['new_invoice'][0]会得到numpy.datetime64('2010-12-01'),但列的dtype会显示为object。

方法2:指定列dtype为datetime64[D](显示层面)

如果仅希望列的dtype显示为datetime64[D],不需要原生numpy对象,可以用pd.to_datetime结合类型转换:

new_data['new_invoice'] = pd.to_datetime(new_data['InvoiceDate']).dt.floor('D').astype('datetime64[D]')

这种方式下,列的dtype会显示为datetime64[D],但单独取出元素仍然是Timestamp对象。

注意:Pandas对datetime64[D]的支持有限,多数操作会自动转回datetime64[ns],如果必须存储原生numpy对象,优先选方法1。

内容的提问来源于Stack Exchange,提问作者kremidzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:42:26