pandas - 使用 .loc 和 slice 设置时,日期时间列被强制转换为 int

标签 pandas datetime slice

我有一列日期时间,需要将其中几个值更改为新的日期时间。当我使用 df.loc[indices, 'col'] = new_datetimes 设置值时,未受影响的值被强制为 int,而新的设置值位于日期时间中。如果我一次设置一个值,则不会发生类型强制。

为了便于说明,我创建了一个仅包含一列的示例 df。

df = pd.DataFrame([dt.datetime(2019,1,1)]*5)
df.loc[[1,3,4]] = [dt.datetime(2019,1,2)]*3
df

这会产生以下结果: output

如果我单独更改索引 1,3,4:

df = pd.DataFrame([dt.datetime(2019,1,1)]*5)
df.loc[1] = dt.datetime(2019,1,2)
df.loc[3] = dt.datetime(2019,1,2)
df.loc[4] = dt.datetime(2019,1,2)
df

我得到了正确的输出: output

建议在设置之前将列表转换为 numpy 数组,这确实解决了问题。但是,如果您尝试使用 numpy 数组设置多个列(其中一些不是日期时间),则会再次出现问题。

在此示例中,数据框有两列,我尝试设置这两列。

df = pd.DataFrame({'dt':[dt.datetime(2019,1,1)]*5, 'value':[1,1,1,1,1]})
df.loc[[1,3,4]] = np.array([[dt.datetime(2019,1,2)]*3, [2,2,2]]).T
df

这给出了以下输出: output

有人可以解释一下造成强制的原因以及如何防止这种情况发生吗?我编写的使用它的代码是一个多月前编写的,并且曾经工作得很好,这可能是关于 future 版本的 pandas 弃用某些功能的警告之一吗?

对正在发生的事情的解释将不胜感激,因为我编写了可能采用类似功能的其他代码,希望确保一切按预期工作。

最佳答案

w-m提出的解决方案有一个“尴尬的细节” 结果列还有时间部分(它没有 之前)。

我还有这样的评论,DataFrame 是而不是系列, 所以他们有专栏,每个专栏都有自己的名字,这是一个坏习惯 依赖默认列名称(连续数字)。

因此,我提出了另一个解决方案,解决上述两个问题:

创建我执行的源 DataFrame:

df = pd.DataFrame([dt.datetime(2019, 1, 1)]*5, columns=['c1'])

请注意,我为唯一的列提供了名称。

然后我创建了另一个 DataFrame:

df2 = pd.DataFrame([dt.datetime(2019,1,2)]*3, columns=['c1'], index=[1,3,4])

它包含您的"new"日期和您在 loc 中使用的数字 我设置为索引(再次使用相同的列名称)。

然后,要更新df,请使用(毫不奇怪)df.update:

df.update(df2)

此函数执行就地更新,因此如果您print(df),您将得到:

          c1
0 2019-01-01
1 2019-01-02
2 2019-01-01
3 2019-01-02
4 2019-01-02

如您所见,在索引 1、3 和 4 下有新日期 并且像以前一样没有时间部分

关于pandas - 使用 .loc 和 slice 设置时,日期时间列被强制转换为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56453350/

相关文章:

python - pandas 中的多个文件读取是否遵循顺序?

python - 唯一索引和单调索引有什么区别?

java - 无法在 Java8 中将悉尼转换为布里斯类 LocalDateTime

python - 合并 csv 值并输出到 csv

list - List.subList和Kotlin中的slice之间的区别

python - 错误 Python Pandas : time data '20160101-000000' does not match format '%YYYY%mm%dd-%HH%MM%SS'

python - Pandas:用两列之一的值替换 Nan

python - 在 Pandas 数据框中,如何将所有元素 x 替换为元素 y?

sql-server-2008 - 在过程中输入日期时间作为输入参数

python - 如何调整Pandas中的数据类型?