熊猫.Read_parquet错误地解释了日期字段



我有一个拼花文件,其中有一个日期字段称为'BusinessDate'。当我将它导入到数据框中时,它会自动确定字段BusinessDate是一个日期(datetime64[ns, UTC])。

但是,由于'BusinessDate'字段的格式是'YYYY-MM-DD',因此其中一些日期导入错误。例如,2013-02-01应该是2013年2月1日,而它实际上被解释为2013年1月2日。

是否可以在导入拼花文件时设置'BusinessDate'字段的正确格式?

最初我使用:

df.read_parquet('data.parquet')

如果我有一个csv文件,我的解决方案是:

custom_date_parser = lambda x: datetime.strptime(x, '%Y-%m-%d')
df.read_csv('data.csv',parse_dates=['BusinessDate'], date_parser=custom_date_parser)

但是,当我尝试使用类似的代码来修复日期问题时,它给出了一个错误:

custom_date_parser = lambda x: datetime.strptime(x, '%Y-%m-%d')
df.read_parquet('data.parquet',parse_dates=['BusinessDate'], date_parser=custom_date_parser)

错误是由于read_parquet函数没有parse_datesdate_parser属性,read_csv函数有。

所以我的问题是:我如何在熊猫中导入一个镶木地板文件,以便'BusinessDate'字段被正确导入为正确格式的日期,在我的情况下是'YYYY-MM-DD'。或者在熊猫read_parquet函数不可能的情况下,是否有可能导入'BusinessDate'字段作为pandas.DataFrame中的字符串字段,以便我可以在之后更改它?

问得好。Pandas还没有这个功能。

一旦你读了parquet,我建议像这样使用你的lambda函数:

df['new_col'] = df['col'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d'))
  • python 3.11.2,pandas 2.0.0测试
  • 使用pd.to_datetime,并设置format参数,这是已有的格式,而不是期望的格式。
    • 转换:'%Y-%d-%m''%Y-%m-%d'
    • format代码可在strftime()strptime()格式代码
    • 中找到。
df['BusinessDate'] = pd.to_datetime(df['BusinessDate'].astype(str), format='%Y-%d-%m').dt.date
  • 如果.read_parquet将parquetdate字段解释为datetime(并添加了一个时间组件),则使用.dt访问器只提取date组件,并将其分配回列。
df['BusinessDate'] = ['BusinessDate'].dt.date

import pandas as pd
# test data
data = pd.date_range('2023-04-01', freq='20s', periods=50000)
df = pd.DataFrame({'test': data})
# display(df.head())
test
0 2023-04-01 00:00:00
1 2023-04-01 00:00:20
2 2023-04-01 00:00:40
3 2023-04-01 00:01:00
4 2023-04-01 00:01:20
# display(df.tail())
test
49995 2023-04-12 13:45:00
49996 2023-04-12 13:45:20
49997 2023-04-12 13:45:40
49998 2023-04-12 13:46:00
49999 2023-04-12 13:46:20
# convert to string and set the current format
df['test'] = pd.to_datetime(df['test'].astype(str), format='%Y-%d-%m %H:%M:%S').dt.date
# display(df.head())
test
0  2023-01-04
1  2023-01-04
2  2023-01-04
3  2023-01-04
4  2023-01-04
# display(df.tail())
test
49995  2023-12-04
49996  2023-12-04
49997  2023-12-04
49998  2023-12-04
49999  2023-12-04

%timeit比较

data = pd.date_range('2023-04-01', freq='20s', periods=50000)
df = pd.DataFrame({'test': data})
# comparison
%timeit pd.to_datetime(df['test'].astype(str), format='%Y-%d-%m %H:%M:%S').dt.date  # result is a datetime.date Dtype
%timeit df['test'].apply(lambda x: x.strftime('%Y-%d-%m'))  # result is a str
%timeit df['test'].dt.strftime('%Y-%d-%m')  # result is a str

输出
162 ms ± 1.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
175 ms ± 1.83 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
185 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

相关内容

  • 没有找到相关文章

最新更新