Pandas Series构造函数生成NaN值

时间:2016-05-23 20:26:01

标签: python datetime pandas nan series

Pandas Series构造函数在传递字典时生成NaN值,其中键是元组,其中一个元素作为日期时间。代码如下。

奇怪的是,当密钥是单个日期时间或没有日期时间的元组时,它不会发生。

似乎这种行为是在pandas 0.15.0中引入的,因为它在0.14.1中工作正常,但我在发行说明中找不到任何内容。

我正在Windows上运行64位Python 2.7。

感谢任何帮助。

import datetime
import pandas as pd

d = {
    (datetime.date(2016, 5, 1), 'k1'): 1,
    (datetime.date(2016, 5, 2), 'k2'): 2
}

print 'Dictionary:'
print d
print

s = pd.Series(d)
print 'Series:'
print s
print

df = pd.DataFrame(d.values(), index=pd.MultiIndex.from_tuples(d.keys()))
print 'DataFrame:'
print df
print

输出:

Dictionary:
{(datetime.date(2016, 5, 1), 'k1'): 1, (datetime.date(2016, 5, 2), 'k2'): 2}

Series:
2016-05-01  k1   NaN
2016-05-02  k2   NaN
dtype: float64

DataFrame:
               0
2016-05-01 k1  1
2016-05-02 k2  2

1 个答案:

答案 0 :(得分:1)

这很奇怪!必须是一个错误。

以下是我的一些实验:

你做了什么:

s = pd.Series({(datetime.date(2016, 5, 1), 'k1'): 1,
               (datetime.date(2016, 5, 2), 'k2'): 2})

s

2016-05-01  k1    NaN
2016-05-02  k2    NaN
dtype: float64

实验#1:使用strftime返回一个字符串,而不是你想要的字符串。但是有效。

s = pd.Series({(datetime.date(2016, 5, 1).strftime('%Y-%m-%d'), 'k1'): 1,
               (datetime.date(2016, 5, 2).strftime('%Y-%m-%d'), 'k2'): 2})

s

2016-05-01  k1    1
2016-05-02  k2    2
dtype: int64

实验#2:使用pd.to_datetime。这工作

s = pd.Series({(pd.to_datetime(datetime.date(2016, 5, 1)).strftime('%Y-%m-%d'), 'k1'): 1,
               (pd.to_datetime(datetime.date(2016, 5, 2)).strftime('%Y-%m-%d'), 'k2'): 2})

s

2016-05-01  k1    1
2016-05-02  k2    2
dtype: int64

实验#3:使用pd.Timestamp。这也有效

s = pd.Series({(pd.Timestamp(datetime.date(2016, 5, 1)), 'k1'): 1,
               (pd. Timestamp(datetime.date(2016, 5, 2)), 'k2'): 2})

s

2016-05-01  k1    1
2016-05-02  k2    2
dtype: int64