Pandas DataFrame.itertuples()自动将对象类型转换为日期和时间类型



我使用Dask和PyOrc从ORC文件中的数据库表中写入数据。为了指定正确的dtypes,我使用meta参数read_sql_table。我的版本是1.2.1

下面是我的代码摘录:

kwargs = dict(
table=fetch_object_name,
index_col=fetch_index_col,
uri=uri,
meta=dask_meta,
columns=list(dask_meta.columns)
)
dask_stream = dd.read_sql_table(**kwargs)
print(dask_stream.dtypes)
dask_stream.map_partitions(
write_to_orc,
data_path,
meta=dask_meta
).compute()

返回

IDX01             Int64
IDX02             Int64
COL01            object
COL02            object
COL03             Int64
COL04             Int64
COL05             Int64
COL06             Int64
COL07           float64
COL08           float64
COL09           float64
COL10            object
COL11            object
COL12    datetime64[ns]
dtype: object

在write_to_orc函数中,我想遍历行以便将它们写入文件,但是当我想打印这些行时,我得到了这个奇怪的行为:

def write_to_orc(df, data_path):
print(df.dtypes)
for row in df.itertuples():
print(row)

我得到了:

IDX01             Int64
IDX02             Int64
COL01            object
COL02            object
COL03             Int64
COL04             Int64
COL05             Int64
COL06             Int64
COL07           float64
COL08           float64
COL09           float64
COL10            object
COL11            object
COL12    datetime64[ns]
dtype: object
Pandas(Index=1, IDX01=1400101, IDX02=447, COL01='Dim   ', COL02='1 Dimanche 2040 (Q1)', COL03=98, COL04=-19191, COL05=21082041, COL06=-6071621782820847456, COL07=3131.25, COL08=-1e+121, COL09=4.775582863893604e+18, COL10=datetime.date(1987, 6, 17), COL11=datetime.time(2, 11, 50), COL12=Timestamp('2012-04-27 13:02:23.860000'))

看起来dtypes是好的,但是COL10和COL11列值的类型是错误的。尽管相关的数据类型是object,但Pandas还是以某种方式将它们转换为日期和时间(以及我在任何时候向Pandas提供的日期和时间格式)!

这让我很困扰,因为TIME不是ORC的识别类型,这就是为什么我想作为字符串处理。

你能帮我理解这种奇怪的行为吗?

提前谢谢你

在您的第一个输出中,COL10COL11被报告为objectdtype,这表明它们可能最初在dask_meta中被转换为datetime对象(至少对于某些行)。作为一种解决方法,您可以显式地将这些列设置为dask_meta中的String(大写版本指的是新的dtype)。

最新更新