Pandas 2 Pyarrow 未转换日期“2006 年 10 月 18 日”

pandas 2 pyarrow not converting date "10/18/2006"

提问人:theakson 提问时间:11/16/2023 最后编辑:theakson 更新时间:11/16/2023 访问量:47

问:

刚开始使用 pandas 2 并想使用箭头后端,但它没有从 csv 转换日期字段。在 csv 中,date2 的格式为“10/18/2006”,称为 date2。为什么会发生这种情况,我怎样才能将date2转换为date32[day][pyarrow]格式。

import pandas as pd
import pyarrow as pa

df_date_test = pd.read_csv( core_test , engine="pyarrow", dtype_backend="pyarrow")

版本

pandas version 2.1.1
numpy version 1.26.2
pyarrow version 14.0.1

df_date_test的布局是

    name    date1   date2
0   bob     2007-01-03  10/18/2006
1   bob     2007-01-04  10/18/2007
2   bob     2007-01-05  10/18/2008
3   bob     2007-01-08  10/18/2009

使用 dtypes

name          string[pyarrow]
date1    date32[day][pyarrow]
date2         string[pyarrow]
dtype: object


from df_date_test = pd.read_csv( test_data , engine="pyarrow",dtype_backend="pyarrow")

 df_date_test.date1.dtypes is string[pyarrow]
 df_date_test.date1[0] is '10/18/2006' 


 <class 'pandas.core.series.Series'>
 RangeIndex: 504528 entries, 0 to 504527 Series name: date1 Non-Null Count Dtype -------------- ----- 341712

 non-null string[pyarrow]

 dtypes: string[pyarrow](1) memory usage: 
熊猫 Pyarrow

评论


答:

0赞 erogluegemen 11/16/2023 #1

我认为我们可以首先将 CSV 作为普通数据帧来读取。(我假设core_test是一个保存文件路径的变量)

df_date_test = pd.read_csv(core_test)

然后我们可以像您想要的那样转换数据时间

df_date_test['date2'] = pd.to_datetime(df_date_test['date2'], format='%m/%d/%Y')

现在,由于我们转换了,我们可以将箭头用于后端

pd.set_option('mode.use_arrow', True)

最后我们可以将df转换为PyArrow格式

final_df = pa.Table.from_pandas(df_date_test)

让我们希望它会有所帮助。如果您遇到任何问题,请与我联系。祝你好运!

评论

1赞 theakson 11/16/2023
嗨@erogluegemen感谢您抽出宝贵时间。我收到此错误“OptionError:没有这样的键:'mode.use_arrow'”但进度:-)日期的格式正确。我可以玩的东西。我希望 pyarrow 能够处理这种情况,因为我在 df_date_test = pd.read_csv( core_test , engine=“pyarrow”, dtype_backend=“pyarrow
0赞 erogluegemen 11/16/2023
对不起,我很熟悉那个:(也许这个链接可以帮助你:arrow.apache.org/docs/python/......我建议您检查日期时间(时间戳)类型和日期类型部分。愿你安好!!!
0赞 theakson 11/16/2023
会做的,谢谢你抽出宝贵时间
0赞 0x26res 11/16/2023 #2

您可以使用 和 argurments 显式指定每个日期/时间列的日期格式。parse_datesdate_format

但是由于某种原因,pandas 假设 date2 是 类型 ,需要用参数显式转换回。datetime64[ns]date32[day][pyarrow]dtype

date_format = {
    "date1": "%Y-%m-%d",
    "date2": "%m/%d/%Y",
}

pd.read_csv(
    "foo.csv" ,
    engine="pyarrow", 
    dtype_backend="pyarrow",
    parse_dates=list(date_format.keys()),
    date_format=date_format,
    dtype={"date2": "date32[day][pyarrow]"},
)

您可以在文档中使用更多选项

评论

0赞 theakson 11/16/2023
没有运气“ValueError:<类'str'>类型的对象无法转换为int”我确实阅读了文档,但这并没有陷入困境。
0赞 0x26res 11/16/2023
它对我有用,你确定你的数据是正确的吗?所有列的格式是否正确?
0赞 theakson 11/16/2023
对不起,我没有感谢您的关注。我已经通过澄清数据来更新问题。我很确定它是正确的并且格式正确。我遇到的问题是箭头无法弄清楚这是一个日期。它的格式类似于日期,名称中包含日期。