Python PySpark数据框中的日期差异(以年为单位)
我来自熊猫的背景,对Spark来说是个新手。我有一个数据框,它的id、dob、age为列。我想从用户的dob中获取用户的年龄,在某些情况下,年龄列为空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 |
+----+------+----------+
| 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