为什么我不能将一个系列类型设置为等于 Python pandas 的另一个系列类型

Why can't I set a series type to equal another series type with Python pandas

我是 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))

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

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

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

当您将系列分配给 DataFrame 列时,pandas 根据 索引 匹配新值。您的原始 DataFrame 可能有一些有意义的索引,但您的新系列它只有默认索引 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 给出一个与旧索引相同的新系列。 (如果您的日期没有正确解析,您可以应用 lambdato_datetime 提供 format 参数。)

(正如 piRsquared 在评论中指出的那样,to_datetime 实际上接受了一个 Series 参数,所以你可以只做 results['CreationDate'] = pandas.to_datetime(results['CreationDate'])。)