我有一个拼花文件,其中有一个日期字段称为'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_dates
或date_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)