簡體   English   中英

將列數據類型從時間戳更改為datetime64

[英]Changing column datatype from Timestamp to datetime64

我有一個要從excel讀取的數據庫作為熊貓數據框,並且日期位於Timestamp dtype ,但我需要它們位於np.datetime64 ,以便進行計算。

我知道函數pd.to_datetime()astype(np.datetime64[ns])方法確實起作用。 但是,無論出於何種原因,我都無法使用上述代碼更新數據框以產生此數據類型。

我還嘗試過從原始數據幀創建一個必需的數據幀,其中僅包含我希望更新類型的日期,將其轉換為np.datetime64並將其重新插入原始數據幀:

dfi = df['dates']
dfi = pd.to_datetime(dfi)
df['dates'] = dfi

但是仍然不起作用。 我也嘗試過一一更新值:

arr_i = df.index
for i in range(len(arr_i)):
    df.at[arri[l],'dates'].to_datetime64()

編輯問題的根源似乎是在dtype的列被更新到np.datetime64 ,但不知何故,從內部獲得單值時,他們仍然有dtype = Timestamp

有沒有人建議一個很快的解決方法?

當您將它們分配給DataFrame時,Pandas嘗試通過將它們存儲為NumPy datetime64 [ns]值來標准化所有形式的日期時間。 但是,當您嘗試訪問各個datetime64值時, 它們將作為Timestamps返回

但是,有一種方法可以防止這種自動轉換:將值列表包裝在dtype系列object

import numpy as np
import pandas as pd

# create some dates, merely for example
dates = pd.date_range('2000-1-1', periods=10)
# convert the dates to a *list* of datetime64s
arr = list(dates.to_numpy())
# wrap the values you wish to protect in a Series of dtype object.
ser = pd.Series(arr, dtype='object')

# assignment with `df['datetime64s'] = ser` would also work
df = pd.DataFrame({'timestamps': dates,
                   'datetime64s': ser})

df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 10 entries, 0 to 9
# Data columns (total 2 columns):
# timestamps     10 non-null datetime64[ns]
# datetime64s    10 non-null object
# dtypes: datetime64[ns](1), object(1)
# memory usage: 240.0+ bytes

print(type(df['timestamps'][0]))
# <class 'pandas._libs.tslibs.timestamps.Timestamp'>

print(type(df['datetime64s'][0]))
# <class 'numpy.datetime64'>

但是要當心! 盡管您可以做一些工作來繞開Pandas的自動轉換機制,但這樣做可能並不明智。 首先,將NumPy數組轉換為列表通常表明您做錯了事,因為這不利於性能。 使用object數組是一個不好的信號,因為對對象數組的操作通常比對本地NumPy dtypes數組的等效操作要慢得多。

您可能正在研究XY問題 -找到一種方法(1)使用Pandas Timestamps而不是試圖強迫Pandas返回NumPy datetime64s或(2)使用datetime64類似於數組的方法(例如Series),可能會更有成果。 NumPy數組)而不是單獨處理值(這會導致時間戳的強制)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM