【问题标题】:Pandas Series constructor produces NaN valuesPandas Series 构造函数产生 NaN 值
【发布时间】:2016-09-20 20:40:36
【问题描述】:

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

【问题讨论】:

  • 是的,这很奇怪。使用datetime.date 时,我的行为与您相同,但如果我改用datetime.datetime,它的工作方式与所写的一样。如果您查看NaN 输出中的索引,pandas 为每个日期添加了一个时间组件。也许它在进行转换时存在错误?
  • iirc 这已在 0.18.0 中修复(也可能在 0.17.1 中)
  • @Jeff 我正在使用 0.18.1 并且看到相同的行为。
  • 好吧 datetime.date 不是一流的类型,所以无论如何都不会修复。没有理由使用它。如果您愿意,可以在问题跟踪器上提出请求并使用拉取请求进行修复。
  • @root 是正确的,包括从 0.15.0 到 0.18.1 的每个版本都显示此行为。

标签: python datetime pandas nan series


【解决方案1】:

这太奇怪了!一定是个bug。

以下是我的一些实验:

你做了什么:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2017-03-13
    • 2015-07-09
    相关资源
    最近更新 更多