在Pandas数据帧中添加列时出现NaT错误

时间:2017-07-31 15:48:39

标签: python pandas dataframe

我正在尝试在python中创建日期的数据框。我使用日期作为索引:

List(Of Integer())

然后我创建一个空数据框:

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]

然后我创建了一个函数,它创建了一个我想要添加为列的pandas系列日期,但是为了让您可以轻松复制,我们假设我们添加了与索引相同的系列:

dfAll_dates = pd.DataFrame(index = aDates)

但结果是:

dfAll_dates['my_added_column'] = aDates

我试图在aDates上使用.totimestamp将我的日期转换为时间戳,但是这并没有解决问题(我有一个"绑定方法Series.to_timestamp为0"),因为没有定义中的类型我不明白为什么我还要转换。

你能帮忙吗?

2 个答案:

答案 0 :(得分:3)

问题是indexesSeries中有DataFrame个不同,因此数据没有对齐并得到NaN s:

一种可能的解决方案是将aDates的值转换为valuesnumpy 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 :(得分:1)

另一种方法是使用#if STATE_DEVELOPMENT jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; #else jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif 方法创建一个系列,其中值采用索引中的内容并且索引保持不变。

pd.Index.to_series

负责索引对齐。但是,你甚至不需要这样做。正如@jezrael所示,如果我们消除传递一个系列对象并且只传递一个数组,dfAll_dates['my_added_column'] = dfAll_dates.index.to_series() 不会尝试对齐那些不存在的索引。我们可以直接引用索引

来完成同样的事情
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中已存在的对象。