![](/img/trans.png)
[英]Dataframe with datetime64 dtype insert into to postgressql timestamp column
[英]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.