我有一个表,比如下面的
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|
+---+------+