Pyspark或python中YYYYMM格式的两个日期之间的计算



我有一个表,比如下面的

ID  Index_month  Month_ID
1     201701      201701
1     201701      201702
1     201701      201703
1     201701      201704
1     201701      201705
1     201701      201706
2     201501      201701
2     201501      201702
2     201501      201703
2     201501      201704
2     201501      201705
2     201501      201706

我想计算从他们的Index month到max month_ID的长度,例如,对于ID 1,长度应该是201706-201701,这是6个月;ID 2的长度为201706-201501,即30个月

期望的输出是

ID  length
1     6
2     30 

Index_month和month_ID都是整数,一开始我只使用month_ID-Index_months,但201706-201501会得到305。

Pyspark中有什么month_between函数可以做到这一点吗?

您可以编写一个快速而肮脏的函数来将字符串转换为日期-时间对象,例如

def datestring_to_datetime(datestring):
return datetime.strptime(datestring, '%Y%m')

然后可以像这样计算月份的差异:

datestring1 = "201706"
datestring2 = "201501"
difference = (datestring_to_datetime(datestring1).year - datestring_to_datetime(datestring2).year) * 12 + (datestring_to_datetime(datestring1).month - datestring_to_datetime(datestring2).month) + 1

哪个将输出30

您可以使用to_date将列转换为日期类型,并根据年差x 12+月差手动计算月差:

import pyspark.sql.functions as F
df2 = df.groupBy('ID','Index_month').max('Month_ID').select(
'ID',
(
12 * (
F.year(F.to_date(F.col('max(Month_ID)').cast('string'), 'yyyyMM')) - 
F.year(F.to_date(F.col('Index_month').cast('string'), 'yyyyMM'))
) + 
F.month(F.to_date(F.col('max(Month_ID)').cast('string'), 'yyyyMM')) - 
F.month(F.to_date(F.col('Index_month').cast('string'), 'yyyyMM')) + 1
).alias('length')
)
df2.show()
+---+------+
| ID|length|
+---+------+
|  1|     6|
|  2|    30|
+---+------+

最新更新