[英]NaT error when adding column in Pandas dataframe
我試圖在python中創建日期的數據框。 我使用日期作為索引:
aDates.head(5)
Out[114]:
0 2009-12-31
1 2010-01-01
2 2010-01-04
3 2010-01-05
4 2010-01-06
Name: Date, dtype: datetime64[ns]
然后,我創建一個空的數據框:
dfAll_dates = pd.DataFrame(index = aDates)
然后,我得到了一個函數,該函數創建一個熊貓系列的日期,試圖將其添加為列,但是為了方便重現,我們假設我們添加了與索引相同的系列:
dfAll_dates['my_added_column'] = aDates
但這導致:
dfAll_dates.head(5)
Out[120]:
my_added_column
Date
2009-12-31 NaT
2010-01-01 NaT
2010-01-04 NaT
2010-01-05 NaT
2010-01-06 NaT
我試圖在aDates上使用.totimestamp將日期轉換為時間戳,但這並不能解決問題(然后,我的綁定方法為Series.to_timestamp為0),因為定義中沒有類型,所以我看不到為什么無論如何我都要轉換。
您能幫上忙嗎?
有一個問題, Series
和DataFrame
有不同的indexes
,因此數據不對齊並獲得NaN
:
一個可能的解決方案是轉換值aDates
到numpy array
由values
:
dfAll_dates = pd.DataFrame(index = aDates)
dfAll_dates['my_added_column'] = aDates.values
print (dfAll_dates)
my_added_column
Date
2009-12-31 2009-12-31
2010-01-01 2010-01-01
2010-01-04 2010-01-04
2010-01-05 2010-01-05
2010-01-06 2010-01-06
或使用to_frame
+ set_index
,也需要重命名列:
d = {'Date':'my_added_column'}
df = aDates.to_frame().set_index('Date', drop=False).rename(columns=d)
print (df)
my_added_column
Date
2009-12-31 2009-12-31
2010-01-01 2010-01-01
2010-01-04 2010-01-04
2010-01-05 2010-01-05
2010-01-06 2010-01-06
或者將DataFrame
構造函數與dict
用於新列:
dfAll_dates = pd.DataFrame({'my_added_column':aDates.values}, index = aDates)
print (dfAll_dates)
my_added_column
Date
2009-12-31 2009-12-31
2010-01-01 2010-01-01
2010-01-04 2010-01-04
2010-01-05 2010-01-05
2010-01-06 2010-01-06
另一種方法是使用pd.Index.to_series
方法創建一個序列,其中值采用索引中的內容,而索引保持不變。
dfAll_dates['my_added_column'] = dfAll_dates.index.to_series()
那會照顧到索引對齊。 但是,您甚至不需要這樣做。 正如@jezrael所示,如果我們消除傳遞一個系列對象而只傳遞一個數組,那么pandas
將不會嘗試對齊不存在的索引。 我們可以通過直接引用索引來完成同一件事
dfAll_dates['my_added_column'] = dfAll_dates.index
在任一情況下
dfAll_dates
my_added_column
2009-12-31 2009-12-31
2010-01-01 2010-01-01
2010-01-04 2010-01-04
2010-01-05 2010-01-05
2010-01-06 2010-01-06
在這兩種情況下,我們都不再需要跟蹤aDates
而只需要引用dfAll_dates
已經存在的dfAll_dates
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.