如何让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
相关产品推荐
相关产品推荐

