【问题标题】:Convert dataframe string/datetime column to parquet date将数据框字符串/日期时间列转换为镶木地板日期
【发布时间】:2021-12-30 05:00:19
【问题描述】:

我有一个数据框,其中有一个字符串列“exam_date”,格式为 YYYYMMDD。例如 20201130

我有一个要求,我必须将此 Dataframe 转换为 parquet 并上传,但是在上传时我希望列的架构类型为 DATE

java -jar parquet-tools.jar schema myfile.parquet 命令应将类型显示为

optional int32 exam_date (DATE);

我已经尝试将列转换为 DateTime 类型,像这样

final_calc_df['exam_date'] = pd.to_datetime(final_calc_df['exam_date'],format='%Y%m%d')
                                           .dt.strftime('%Y%m%d')

但是,这给了我这样的输出

optional binary exam_date (STRING);

我应该怎么做才能得到想要的输出?

我想要的是将数据保留为 YYYYMMDD 格式,而不是字符串/日期时间/二进制类型,我希望它是日期类型 Date

optional int32 exam_date (DATE);

【问题讨论】:

  • 尝试转换为 UNIX 时间,数据类型为 int(无小数天),请参阅 parquet format: date

标签: python dataframe datetime time parquet


【解决方案1】:

如果将列转换为 datetime.date,它应该可以工作:

df = pd.DataFrame({'a': ['20211011']})
from datetime import datetime
def to_date(s):
  return datetime.strptime(s, '%Y%m%d').date()
df['a'] = df['a'].map(to_date)

或更简单但可能效率较低:

df['a'] = pd.to_datetime(df['a'], format='%Y%m%d').dt.date

【讨论】:

  • 我认为如果你在 pandas 日期时间列(不是原生 Python 日期时间)上调用 .dt.date() 会更简单
  • 我认为这假设该列已经是 datetime pandas 列。从 OP 来看,还不是很清楚,但似乎值是字符串?我更新了示例以执行纯 pandas 代码(感谢您的注意),但我认为这效率较低,因为它需要从 String -> offset 自 unix epoch -> calendar date 开始。使用本机 python 日期时间进行解析应该省去我认为的中间步骤。
  • @MicahKornfield 我希望保持 YYYYMMDD 格式,执行 dt.date 会更改格式,pd.to_datetime(df['a'], format='%Y%m%d') 也会并不意味着它会改变日期的格式。这意味着它将以给定格式接受来自 df['a'] 的日期,然后将其转换为日期时间。
  • 为 Pandas 写入 Parquet 的底层引擎是 Arrow。目前尚不清楚“保持格式”是什么意思。如果数据是字符串,它将始终转换为字节。如果对显示目的很重要,您可以使用上面的代码,单独保存字符串列,并在写入 Parquet 后恢复该列。如果将其保留以进行优化,则首先转换为arrow Table(to_parquet 无论如何都会这样做)并将列转换为时间戳日期可能会更有效。
猜你喜欢
  • 2022-08-18
  • 2011-06-13
  • 2015-09-17
  • 2021-05-31
  • 2019-04-12
  • 2011-09-08
  • 2015-03-24
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多