Python Pandas DataFrame.itertuples()自动将对象数据类型转换为日期和时间数据类型
我使用Dask和PyOrc在ORC文件中从数据库表写入数据。 为了指定正确的数据类型,我使用了元参数Python Pandas DataFrame.itertuples()自动将对象数据类型转换为日期和时间数据类型,python,pandas,dataframe,dask,Python,Pandas,Dataframe,Dask,我使用Dask和PyOrc在ORC文件中从数据库表写入数据。 为了指定正确的数据类型,我使用了元参数read\u sql\u table。 我的熊猫版本是1.2.1 下面是我的代码摘录: kwargs = dict( table=fetch_object_name, index_col=fetch_index_col, uri=uri, meta=dask_meta, colu
read\u sql\u 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'))
看起来数据类型不错,但是COL10和COL11列的值的类型不正确。不知何故,Pandas将它们转换为日期和时间(在任何时候我都会将日期和时间格式提供给Pandas),尽管相关的数据类型是object
这让我很困扰,因为时间对于兽人来说不是一种公认的类型,这就是为什么我想被当作字符串来处理
你能帮我理解这种奇怪的行为吗
提前感谢在您的第一次输出中,
COL10
和COL11
被报告为object
dtype,这表明它们可能最初在dask\u meta
中转换为datetime
对象(至少对于某些行)。作为一种解决方法,您可以在dask_meta
中将这些列显式设置为String
(大写版本指的是新的数据类型)