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

Dji*_*ggy 4 python dataframe pandas

我正在尝试在 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]
Run Code Online (Sandbox Code Playgroud)

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

dfAll_dates = pd.DataFrame(index = aDates)
Run Code Online (Sandbox Code Playgroud)

然后我得到了一个函数,它创建了一个我试图添加为列的 Pandas 系列日期,但为了您可以轻松重现,假设我们添加了用于索引的相同系列:

dfAll_dates['my_added_column'] = aDates
Run Code Online (Sandbox Code Playgroud)

但这导致:

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
Run Code Online (Sandbox Code Playgroud)

我试图在 aDates 上使用 .totimestamp 将我的日期转换为时间戳,但这并没有解决问题(然后我有一个“绑定方法 Series.to_timestamp 为 0”),并且因为定义中没有类型我看不到为什么我无论如何都必须转换。

你能帮忙吗?

jez*_*ael 7

有问题也有不同indexesSeriesDataFrame,所以数据没有对齐,并得到NaNS:

一个可能的解决方案是将值转换aDatesnumpy arrayvalues

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
Run Code Online (Sandbox Code Playgroud)

或使用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
Run Code Online (Sandbox Code Playgroud)

或者对新列使用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
Run Code Online (Sandbox Code Playgroud)