当我们使用pyspark创建数据框时,通常使用这种方式:
myItems=spark.createDataFrame([(1,'a'),
(2,'c')],
['id','item'])
每一行都是数据框中的一行。但是在这里,我需要创建一个数据框,其中包括4个组和日期。例如:
myItems=spark.createDataFrame([(1,2019-01-01',0),
(1,2019-01-02',0),
......
(1,2019-01-31',0),
(2,'2019-01-01',0),
......
(2,'2019-01-31',0),
data about group 3,
data about group 4],
['group','date','value'])
我需要生成4个组:1、2、3、4。对于每个组,都有一个从2019-01-01到2019-01-31的日期列。值都为0。
所以,我想我需要在这里使用一些迭代。但是我不知道该怎么做。有人可以在这里帮助我吗?
答案 0 :(得分:1)
您可以使用普通python迭代创建tuples
中的(group,date,value)
。下面的代码相当通用,适用于几乎所有日期以及要创建的任意多个组。只需更改变量num_of_groups
,start_date
和end_date
以符合您的要求即可。
# Number of groups you want to create, starting with 1.
num_of_groups=4
# Requisite packages to import for doing the iteration on the dates.
from datetime import date, timedelta
# Initialize start and end date.
start_date = date(2019, 1, 1)
end_Date = date(2019, 1, 31)
delta = end_Date - start_date
您可以使用datetime
Python库在日期format
中包含日期,您可以在其上进行迭代以获取连续的日期,最后使用strftime
来转换date
转换为必需的string
格式。
# This will store the list of consecutive dates from start to end date.
list_dates=[]
for i in range(delta.days + 1):
list_dates = list_dates + [(start_date + timedelta(i)).strftime("%d-%m-%Y")]
print(list_dates)
['01-01-2019','02-01-2019','03-01-2019',.....'29-01-2019','30-01-2019','31-01-2019']
使用嵌套的list comprehensions
创建上述的元组列表。
myValues=[(group,date,0) for group in range(1,num_of_groups+1) for date in list_dates]
print(myValues)
[(1, '01-01-2019', 0), (1, '02-01-2019', 0), ... (4, '30-01-2019', 0), (4, '31-01-2019', 0)]
最后,创建DataFrame。
myItems=spark.createDataFrame(myValues,['group','date','value'])
myItems.show(200)
+-----+-----------+-----+
|group| date|value|
+-----+----------+------+
| 1| 01-01-2019| 0|
| 1| 02-01-2019| 0|
| 1| 03-01-2019| 0|
| 1| 04-01-2019| 0|
| 1| 05-01-2019| 0|
.
.
.
| 4| 28-01-2019| 0|
| 4| 29-01-2019| 0|
| 4| 30-01-2019| 0|
| 4| 31-01-2019| 0|
+-----+-----------+-----+