【问题标题】:Why can't I set a series type to equal another series type with Python pandas为什么我不能使用 Python pandas 将系列类型设置为等于另一个系列类型
【发布时间】:2018-03-17 10:43:14
【问题描述】:

我对 python 还很陌生,如果这似乎是一个简单的问题,请原谅我。

我有一个数据框。我的目标是获取数据框的值并将其转换为另一种类型并替换该列。代码如下:

strtotime = {}
for x in range(0,len(results['CreationDate'])):
    strtotime[x] = datetime.strptime(results['CreationDate'][x], '%Y-%m-%dT%H:%M:%S.%f')
results['CreationDate'] = pd.to_datetime(pd.Series(strtotime))

我将值存储为字典,使用pd.Series 将其转换为系列,此时我相当确定我可以将一个系列替换为另一个系列:

results['CreationDate'] = pd.to_datetime(pd.Series(strtotime))

但我得到的结果是一列NaT,而不是这些整洁的日期时间2015-01-01 10:59:37.403

然后我用results['CreationDate'] = list(pd.to_datetime(pd.Series(strtotime)))

效果如我所愿。所以我的问题是为什么会这样?它甚至与对象类型有关吗?

【问题讨论】:

    标签: python python-3.x pandas datetime


    【解决方案1】:

    当您将 Series 分配给 DataFrame 列时,pandas 会根据 index 匹配新值。您的原始 DataFrame 可能具有一些有意义的索引,但您的新 Series 它只有默认索引 0、1、2、3...,因为这些是您字典中的键。这是一个简单的例子:

    >>> d = pandas.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[10, 11, 12])
    >>> d
        A  B
    10  1  4
    11  2  5
    12  3  6
    >>> d["C"] = pandas.Series([8, 88, 888])
    >>> d
        A  B   C
    10  1  4 NaN
    11  2  5 NaN
    12  3  6 NaN
    >>> d["C"] = pandas.Series([8, 88, 888], index=[10, 11, 12])
    >>> d
        A  B    C
    10  1  4    8
    11  2  5   88
    12  3  6  888
    

    请注意,分配具有错误索引的系列会导致 NaN,但创建具有相同索引的新系列会导致按预期输入值。

    在您的情况下,您通过将函数应用于原始列的每个元素来创建新系列。不要重复这样做。使用.map 方法。在这种情况下,有一个内置的 pandas 函数可以将字符串转换为日期时间:

    results['CreationDate'] = results['CreationDate'].map(pandas.to_datetime)
    

    .map 给出了一个与旧系列具有相同索引的新系列。 (如果您的日期没有正确解析,您可以应用一个 lambda,它为 to_datetime 提供一个 format 参数。)

    (正如 piRsquared 在评论中指出的那样,to_datetime 实际上接受一个 Series 参数,因此您可以直接使用 results['CreationDate'] = pandas.to_datetime(results['CreationDate'])。)

    【讨论】:

    • pd.Series(strtotime) 是从字典创建的。意思是,指定了索引。因此,未使用默认值。但是,您的观点仍然有效。并且......考虑到解释的深度,很好的答案值得投票。
    • 另外,当pd.to_datetime 接受pd.Series 时,我不会使用map。这应该工作pandas.to_datetime(results['CreationDate'])
    • @piRSquared:啊,我忘了你可以这样直接通过Series,是的,这样更好。
    猜你喜欢
    • 2023-01-25
    • 2018-12-08
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2013-09-07
    • 2021-07-18
    相关资源
    最近更新 更多