2017-07-31 98 views
2

我正尝试在python中创建日期的数据框。我使用的日期作为索引:在熊猫数据框中添加列时出现NaT错误

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”),并且因为没有类型定义我不明白为什么我不得不转换。

你能帮忙吗?

+0

您的预期产出是多少?您的索引不排队。您创建日期索引,然后指定一系列日期,并且索引从0开始。因此,具有日期索引的数据框返回NaT。你的系列没有与你的索引对齐。 –

回答

2

出现问题也有在SeriesDataFrame不同indexes,所以数据没有对齐,并得到NaN S:

一个可能的解决方案是通过valuesaDates值转换为numpy array

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 
1

另一种方法是使用创建一系列其中的值取什么是在指数和指数保持不变的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