我正在使用 parquet,我需要使用
date32[day]
对象来表示我的日期,但我不清楚如何使用 pandas 来生成这个确切的数据类型,而不是时间戳。
考虑这个例子:
from datetime import datetime, date
import pyarrow.parquet as pq
import pandas as pd
df1 = pd.DataFrame({'date': [date.today()]})
df1.to_parquet('testdates.parquet')
pq.read_table("testdates.parquet") # date32[day]
# pandas version
df2 = pd.DataFrame({'date': [pd.to_datetime('2022-04-07')]})
df2.to_parquet('testdates2.parquet')
pq.read_table("testdates2.parquet") # timestamp[us]
来自
pandas
与 pyarrow
这里的积分
import pyarrow as pa
from datetime import date
df2 = pd.Series({'date':[date(2022,4,7)]})
df2_dat32 = pa.array(df2)
print("dataframe:", df2)
print("value of dataframe:", df2_dat32[0])
print("datatype:", df2_dat32.type)
输出
dataframe: date [2022-04-07]
dtype: object
value of dataframe: [datetime.date(2022, 4, 7)]
datatype: list<item: date32[day]>
编辑:如果您有一整列日期,您需要首先将日期时间转换为日期,然后使用与上面相同的方法。请参阅下面的示例:
import pyarrow as pa
from datetime import date
#create pandas DataFrame with one column with five
#datetime values through a dictionary
datetime_df = pd.DataFrame({'DateTime': ['2021-01-15 20:02:11',
'1989-05-24 20:34:11',
'2020-01-18 14:43:24',
'2021-01-15 20:02:10',
'1999-04-04 20:34:11']})
datetime_df['Date'] = pd.to_datetime(datetime_df['DateTime']).dt.date
date_series = pd.Series(datetime_df['Date'])
print(date_series)
输出:
0 2021-01-15
1 1989-05-24
2 2020-01-18
3 2021-01-15
4 1999-04-04
Name: Date, dtype: object
然后使用pyarrow进行转换:
df2_dat32 = pa.array(date_series)
print("datatype of values in the dataframe with dates:", type(date_series[0]))
print("value of dataframe after converting using pyarrow:", df2_dat32[0])
print("datatype after converting using pyarrow :", df2_dat32.type)
输出:
datatype of values in the dataframe with dates: <class 'datetime.date'>
value of dataframe after converting using pyarrow: 2021-01-15
datatype after converting using pyarrow : date32[day]
Pandas 2.0 允许通过添加
[pyarrow]
后缀来指定 PyArrow 类型。
让我们使用您最初提供的示例:
import pandas as pd
df2 = pd.DataFrame({'date': [pd.to_datetime('2022-04-07')]})
df2.dtypes
date datetime64[ns]
dtype: object
我们可以使用
datetime64[ns]
方法简单地将 day32[day]
转换为
astype()
:
df2 = df2.astype({'date': 'date32[pyarrow]'})
df2.dtypes
date date32[day][pyarrow]
dtype: object
我们看到 Pandas 使用了预期的
date32
类型。此外,以 parquet 格式保存文件,该类型将保留:
df2.to_parquet('testdates2.parquet')
pq.read_table("testdates2.parquet")
pyarrow.Table
date: date32[day]
----
date: [[2022-04-07]]
请注意,Pandas 还没有 相当于 pyarrow 后端 date32
类型的 Pandas 扩展类型。