Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark数据框中的日期差异(以年为单位)_Python_Apache Spark_Pyspark_Pyspark Dataframes - Fatal编程技术网

Python PySpark数据框中的日期差异(以年为单位)

Python PySpark数据框中的日期差异(以年为单位),python,apache-spark,pyspark,pyspark-dataframes,Python,Apache Spark,Pyspark,Pyspark Dataframes,我来自熊猫的背景,对Spark来说是个新手。我有一个数据框,它的id、dob、age为列。我想从用户的dob中获取用户的年龄,在某些情况下,年龄列为空 +----+------+----------+ | id | age | dob | +----+------+----------+ | 1 | 24 | NULL | | 2 | 25 | NULL | | 3 | NULL | 1/1/1973 | | 4 | NULL | 6/6/1980 |

我来自熊猫的背景,对Spark来说是个新手。我有一个数据框,它的id、dob、age为列。我想从用户的dob中获取用户的年龄,在某些情况下,年龄列为空

+----+------+----------+
| id | age  |   dob    |
+----+------+----------+
|  1 | 24   | NULL     |
|  2 | 25   | NULL     |
|  3 | NULL | 1/1/1973 |
|  4 | NULL | 6/6/1980 |
|  5 | 46   |          |
|  6 | NULL | 1/1/1971 |
+----+------+----------+
我想要一个新的列,将计算年龄从出生日期和当前日期

我尝试过这个,但没有得到任何结果:

df.withColumn("diff", 
              datediff(to_date(lit("01-06-2020")),
                       to_date(unix_timestamp('dob', "dd-MM-yyyy").cast("timestamp")))).show()

您需要计算日期差,并将结果转换为年份,如下所示:

df.withColumn('diff', 
    when(col('age').isNull(), 
         floor(datediff(current_date(), to_date(col('dob'), 'M/d/yyyy'))/365.25))\
  .otherwise(col('age'))).show()
产生:

+---+----+--------+----+
| id| age|     dob|diff|
+---+----+--------+----+
|  1|  24|    null|  24|
|  2|  25|    null|  25|
|  3|null|1/1/1973|  47|
|  4|null|6/6/1980|  39|
|  5|  46|    null|  46|
|  6|null|1/1/1971|  49|
+---+----+--------+----+

它保留不为null的年龄列,并计算年龄为null的dob和今天之间的天数差。然后将结果除以365.25,转换为年数;您可能需要确认这一点,然后再进行铺底。

您需要计算日期差,并将结果转换为年份,如下所示:

df.withColumn('diff', 
    when(col('age').isNull(), 
         floor(datediff(current_date(), to_date(col('dob'), 'M/d/yyyy'))/365.25))\
  .otherwise(col('age'))).show()
产生:

+---+----+--------+----+
| id| age|     dob|diff|
+---+----+--------+----+
|  1|  24|    null|  24|
|  2|  25|    null|  25|
|  3|null|1/1/1973|  47|
|  4|null|6/6/1980|  39|
|  5|  46|    null|  46|
|  6|null|1/1/1971|  49|
+---+----+--------+----+
它保留不为null的年龄列,并计算年龄为null的dob和今天之间的天数差。然后将结果除以365.25,转换为年数;您可能需要确认这一点,然后再进行铺垫。

我认为,在涉及到年差时,使用月与月之间的间隔更合适。只有当您需要天数差异时,我们才应该使用datediff

接近- val数据= |id |年龄|出生日期 | 1 | 24 | | 2 | 25 | | 3 | | 1/1/1973 | 4 | | 6/6/1980 | 5 | 46 | | 6 | | 1/1/1971 .条纹边缘 val stringDS=data.splitSystem.lineSeparator .map|.split\\|.map|.replaceAll^[\t]+|[\t]+$,.mkString, .toSeq.toDS val df=spark.read .选项SEP, .optioninferSchema,对 .optionheader,true .csvstringDS df.showfalse 打印模式 /** * +--+--+----+ *|身份|年龄|出生日期| * +--+--+----+ *| 1 | 24 |空| *| 2 | 25 |空| *| 3 |空| 1/1/1973| *| 4 |空| 6/6/1980| *| 5 | 46 |空| *| 6 |空| 1971年1月1日| * +--+--+----+ * *根 *|-id:integer nullable=true *|-age:integer nullable=true *|-dob:string nullable=true */ 发现年龄 df.withColumndiff, 聚结, 当前日期与截止日期之间的整月,年月日,对。12,2分 显示 /** * +--+--+----+---+ *|身份|年龄|出生日期|差异| * +--+--+----+---+ *| 1 | 24 |空| 24.0| *| 2 | 25 |空| 25.0| *| 3 |空| 1/1/1973 | 47.42| *| 4 |空| 6/6/1980 | 39.99| *| 5 | 46 |空| 46.0| *| 6 |空| 1/1/1971 | 49.42| * +--+--+----+---+ */ 如果你想用整数表示年龄,就把它四舍五入到0

我认为,当涉及到年差时,使用月与月之间的时间更合适。只有当您需要天数差异时,我们才应该使用datediff

接近- val数据= |id |年龄|出生日期 | 1 | 24 | | 2 | 25 | | 3 | | 1/1/1973 | 4 | | 6/6/1980 | 5 | 46 | | 6 | | 1/1/1971 .条纹边缘 val stringDS=data.splitSystem.lineSeparator .map|.split\\|.map|.replaceAll^[\t]+|[\t]+$,.mkString, .toSeq.toDS val df=spark.read .选项SEP, .optioninferSchema,对 .optionheader,true .csvstringDS df.showfalse 打印模式 /** * +--+--+----+ *|身份|年龄|出生日期| * +--+--+----+ *| 1 | 24 |空| *| 2 | 25 |空| *| 3 |空| 1/1/1973| *| 4 |空| 6/6/1980| *| 5 | 46 |空| *| 6 |空| 1971年1月1日| * +--+--+----+ * *根 *|-id:integer nullable=true *|-age:integer nullable=true *|-dob:string nullable=true */ 发现年龄 df.withColumndiff, 聚结, 当前日期与截止日期之间的整月,年月日,对。12,2分 显示 /** * +--+--+----+---+ *|身份|年龄|出生日期|差异| * +--+--+----+---+ *| 1 | 24 |空| 24.0| *| 2 | 25 |空| 25.0| *| 3 |空| 1/1/1973 | 47.42| *| 4 |空| 6/6/1980 | 39.99| *| 5 | 46 |空| 46.0| *| 6 |空| 1/1/1971 | 49.42| * +--+--+----+---+ */ 如果你想用整数表示年龄,就把它四舍五入到0

使用两个月之间的时间,如中,但采用不同的方法:

在我的表格中,我还没有“年龄”栏; 对于舍入到整年,我使用.int。 从pyspark.sql导入函数为F df=df.带“年龄”列,F.当前日期之间的月数,F.col'dob'/12.cast'int' 如果系统日期为UTC且您的区域设置不同,则可能需要单独的日期函数:

from pyspark.sql import functions as F
def current_local_date():
    return F.from_utc_timestamp(F.current_timestamp(), 'Europe/Riga').cast('date')
df = df.withColumn('age', (F.months_between(current_local_date(), F.col('dob')) / 12).cast('int'))
使用两个月之间的时间,如中,但采用不同的方法:

在我的表格中,我还没有“年龄”栏; 对于舍入到整年,我使用.int。 从pyspark.sql导入函数为F df=df.带“年龄”列,F.当前日期之间的月数,F.col'dob'/12.cast'int' 如果 系统日期为UTC,且您的区域设置不同,可能需要单独的日期函数:

from pyspark.sql import functions as F
def current_local_date():
    return F.from_utc_timestamp(F.current_timestamp(), 'Europe/Riga').cast('date')
df = df.withColumn('age', (F.months_between(current_local_date(), F.col('dob')) / 12).cast('int'))

你能检查一下我的答案吗?我使用了一些不同的方法得到月差,然后将其除以12。我认为,当涉及到年差时,使用月与月之间的时间更合适。我们应该使用datediff只有当你需要不同的日期扫描你也检查我的答案吗?我使用了一些不同的方法得到月差,然后将其除以12。我认为,当涉及到年差时,使用月与月之间的时间更合适。只有当您需要天数差异时,我们才应该使用datediff