【问题标题】:Derive dob / date of birth from merged numbers in pyspark or python?从pyspark或python中的合并数字派生出生日期/出生日期?
【发布时间】:2021-08-02 11:16:20
【问题描述】:

我正在尝试从 pyspark 中的日期数据类型格式 (YYYY-MM-DD) 派生 DOB,该列将信息反转为一个大整数,并删除了一位数日/月的前导零。最后一点意味着数据的长度在 6-8 位之间变化。 7 位数字在两种情况下由于歧义而无法推导,我很乐意为这些情况输出空值。

例子:

  • 831945 = 1945 年 3 月 8 日
  • 1232000 = 2000 年 3 月 12 日
  • 11102000 = 2000 年 10 月 11 日

模棱两可的例子:

  • 111YYYY = 11 月 1 日或 1 月 11 日
  • 112YYYY = 12 月 1 日或 2 月 11 日

代码的逻辑非常复杂,比我高一点。我想我可以在导出 DOB 之前导出新的年、月和日列。首先导出日期和年份 cols,同时从合并的数字 col 中删除这些数字以离开月份。

年份 = 最后 4 位数字。

日期:

  • 如果 len 6 则天 = 第一个数字
  • 如果 len 7 和第二个数字 = 0 或 >=2 那么天 = 前两个数字
  • 如果 len 7 和第 2 位 = 1 和第 3 位 ==0 则天 = 第一个数字
  • 如果 len 7 和第 2 位 = 1 和第 3 位 ==1,2 则输出 null
  • 如果 len 7 和第二个数字 = 1 和第三个数字 >=3 那么天 = 前两个 数字
  • 如果 len 7 和第二个数字 =>2 那么天 = 前两个数字
  • 如果 len 8 则天 = 前两位数

之前:

merged digits  | Day | Year
1232000        |     | 

之后:

merged digits  | Day | Year
3              | 12  | 2000

只是一个想法。感谢您的帮助和想法!

【问题讨论】:

  • 到目前为止你尝试过什么?您只需使用whensubstring 即可做到这一点。我看不出是什么阻碍了你。

标签: python date pyspark string-to-datetime


【解决方案1】:

按照你的逻辑:

from pyspark.sql import functions as F


F.when(
    F.size("merged_digits") == 6,
    F.Array(
        F.lpad(F.substring("merged_digits", 1, 1), 2, "0"),
        F.lpad(F.substring("merged_digits", 2, 1), 2, "0"),
        F.substring("merged_digits", 3, 4),
    ),
).when(
    F.size("merged_digits") == 8,
    F.Array(
        F.substring("merged_digits", 1, 2),
        F.substring("merged_digits", 3, 2),
        F.substring("merged_digits", 5, 4),
    ),
).when(
    F.substring("merged_digits", 1, 1) == "0",
    F.Array(
        F.substring("merged_digits", 1, 2),
        F.lpad(F.substring("merged_digits", 3, 1), 2, "0"),
        F.substring("merged_digits", 4, 4),
    ),
).when(
    F.substring("merged_digits", 2, 1).cast("int") >= 2,
    F.Array(
        F.substring("merged_digits", 1, 2),
        F.lpad(F.substring("merged_digits", 3, 1), 2, "0"),
        F.substring("merged_digits", 4, 4),
    ),
).when(
    (F.substring("merged_digits", 2, 1) == "1")
    & (F.substring("merged_digits", 3, 1) == "0"),
    F.Array(
        F.lpad(F.substring("merged_digits", 1, 1), 2, "0"),
        F.substring("merged_digits", 2, 2),
        F.substring("merged_digits", 4, 4),
    ),
)

我创建的输出是一个数组,其中第一个元素为日,第二个为月,最后一个为年,全部用 0 左填充以具有相同的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2013-05-10
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多