提问人:theakson 提问时间:11/16/2023 最后编辑:theakson 更新时间:11/16/2023 访问量:47
Pandas 2 Pyarrow 未转换日期“2006 年 10 月 18 日”
pandas 2 pyarrow not converting date "10/18/2006"
问:
刚开始使用 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:
答:
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_dates
date_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
对不起,我没有感谢您的关注。我已经通过澄清数据来更新问题。我很确定它是正确的并且格式正确。我遇到的问题是箭头无法弄清楚这是一个日期。它的格式类似于日期,名称中包含日期。
评论