我需要在dataframe列中将整数转换为datetime对象,该列具有混合数据类型。要知道是否应用该功能,我需要引用另一列。
我已经能够通过将数据帧转换为字典并对其进行遍历来解决此问题,但是当数据太大时花费的时间太长。
当我尝试使用.loc和.map解决此问题时,仅当我未设置相等性时,它才会提供正确的输出。
这是我的数据框。
df = pd.DataFrame([
{'data' : 'abc', 'type': 'string'},
{'data' : 1559347200000, 'type': 'int'},
{'data': pd.to_datetime(1559347200000, unit='ms'), 'type':'datetime'}
])
运行此命令时,数据框的行为符合预期。列:“数据”具有混合类型,列:“类型”是我创建的,目的是让我知道列“数据”中的内容。
现在我需要将“数据”转换为日期时间对象,其中“类型” =“整数”。
df.loc[df['type']=='int', 'data'].map(lambda x:pd.to_datetime(x,unit='ms'))
此dtype:datetime64的'2019-06-01'的输出看起来正确。
但是,当我使用以下命令将其设置为等于自身时:
df.loc[df['type']=='int', 'data'] = df.loc[df['type']=='int', 'data'].map(lambda x:pd.to_datetime(x,unit='ms'))
然后致电:
df.loc[df['type']=='int', 'data']
我得到了1559347200000000000的输出
在这种情况下为什么它不返回“ 2019-06-01”?
答案 0 :(得分:1)
执行快捷方式,而不是根据“类型”列中的内容检查“类型”列是什么,然后将更改应用于“数据”列。在lambda表达式内的“数据”列中检查值的类型,如果它是int类型,则转换为datetime,否则保持不变。
df=df.applymap(lambda x: pd.to_datetime(x,unit='ms') if type(x) is int else x)
输出:
data type
0 abc string
1 2019-06-01 00:00:00 int
2 2019-06-01 00:00:00 datetime