繁体   English   中英

使用 iloc 或 loc 将多列转换为日期时间

[英]Converting multiple columns to datetime using iloc or loc

我不确定这是否是预期的行为,但下面是一个示例数据框。

df = pd.DataFrame([['2020-01-01','2020-06-30','A'],
                    ['2020-07-01','2020-12-31','B']],
                        columns = ['start_date', 'end_date', 'field1'])

在升级到 Pandas 版本1.3.4 ,我相信我能够像这样转换列数据类型:

df.iloc[:,0:2] = df.iloc[:,0:2].apply(pd.to_datetime)

尽管似乎已将列转换为日期时间,

            start_date             end_date field1
0  2020-01-01 00:00:00  2020-06-30 00:00:00      A
1  2020-07-01 00:00:00  2020-12-31 00:00:00      B

dtypes 似乎仍然是对象:

start_date    object
end_date      object
field1        object

我知道我可以使用下面的代码做同样的事情,我只是想知道这是否是lociloc的预期行为。

df[['start_date', 'end_date']] = df[['start_date', 'end_date']].apply(pd.to_datetime)
start_date    datetime64[ns]
end_date      datetime64[ns]
field1                object

此行为是1.3.0 中引入的更改的一部分。

使用lociloc设置值时尝试就地操作

使用lociloc设置整列时,pandas 将尝试将值插入现有数据中,而不是创建一个全新的数组。

iloc如果新数组可以适合现有类型, ilocloc将尝试更改数组的iloc

import pandas as pd

df = pd.DataFrame({'A': [1.2, 2.3], 'B': [3.4, 4.5]})
print(df)
print(df.dtypes)
df.loc[:, 'A':'B'] = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
print(df)
print(df.dtypes)

输出:

     A    B
0  1.2  3.4
1  2.3  4.5
A    float64
B    float64
dtype: object
     A    B
0  1.0  3.0
1  2.0  4.0
A    float64
B    float64
dtype: object

相反: 设置frame[keys] = values时切勿原地操作

当使用frame[keys] = values设置多列时,新数组将替换这些键的预先存在的数组,这些数组不会被覆盖( GH39510 )。 因此,列将保留值的 dtype(s),永远不会转换为现有数组的 dtypes。

import pandas as pd

df = pd.DataFrame({'A': [1.2, 2.3], 'B': [3.4, 4.5]})
print(df)
print(df.dtypes)
df[['A', 'B']] = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
print(df)
print(df.dtypes)

输出:

     A    B
0  1.2  3.4
1  2.3  4.5
A    float64
B    float64
dtype: object
   A  B
0  1  3
1  2  4
A    int64
B    int64
dtype: object

考虑到这些变化,我们现在必须执行以下操作:

import pandas as pd

df = pd.DataFrame([['2020-01-01', '2020-06-30', 'A'],
                   ['2020-07-01', '2020-12-31', 'B']],
                  columns=['start_date', 'end_date', 'field1'])

cols = df.columns[0:2]
df[cols] = df[cols].apply(pd.to_datetime)
# or
# df[df.columns[0:2]] = df.iloc[:, 0:2].apply(pd.to_datetime)

print(df)
print(df.dtypes)

输出:

  start_date   end_date field1
0 2020-01-01 2020-06-30      A
1 2020-07-01 2020-12-31      B
start_date    datetime64[ns]
end_date      datetime64[ns]
field1                object
dtype: object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM