PySpark实现13次7天间隔日期扩展数据生成求助
PySpark/Python 实现主表按7天间隔扩展13条记录
需求:把含id和date字段的主表,每条记录生成13条扩展数据,包含id、7的倍数天数(x字段,取值7、14…91),以及仅保留日期部分的计算后日期。
PySpark 实现代码
from pyspark.sql import SparkSession from pyspark.sql.functions import explode, sequence, lit, date_add, date_format, col # 初始化Spark会话 spark = SparkSession.builder.appName("DateExpand").getOrCreate() # 模拟主表数据 data = [ (1, "2019-02-21 10:00:00"), (2, "2019-02-27 09:50:33") ] df = spark.createDataFrame(data, ["id", "date"]) # 把字符串转成时间戳类型 df = df.withColumn("date", col("date").cast("timestamp")) # 生成1-13的序列并展开,计算x和新日期 expanded_df = df.withColumn("n", explode(sequence(lit(1), lit(13)))) \ .withColumn("x", col("n") * 7) \ .withColumn("date", date_format(date_add(col("date"), (col("n") - 1)*7), "yyyy-MM-dd")) \ .select("id", "x", "date") # 查看结果 expanded_df.show(truncate=False)
关键说明
sequence(lit(1), lit(13))生成1到13的整数序列,explode将序列拆成单独行,每条原始记录对应13行x是序号乘以7,得到7的倍数(7到91)date_add给原始日期加上(n-1)*7天,date_format提取日期部分去除时分秒
Python(Pandas)实现代码
import pandas as pd from datetime import timedelta # 模拟主表数据 data = { "id": [1, 2], "date": ["2019-02-21 10:00:00", "2019-02-27 09:50:33"] } df = pd.DataFrame(data) # 转成datetime类型 df["date"] = pd.to_datetime(df["date"]) # 每条记录重复13次 expanded_df = df.loc[df.index.repeat(13)].reset_index(drop=True) # 给每个id的13行生成1-13的序号 expanded_df["n"] = expanded_df.groupby("id").cumcount() + 1 # 计算x和新日期 expanded_df["x"] = expanded_df["n"] * 7 expanded_df["date"] = expanded_df["date"] + expanded_df["n"].apply(lambda x: timedelta(days=(x-1)*7)) expanded_df["date"] = expanded_df["date"].dt.date # 只保留日期部分 # 筛选需要的列 expanded_df = expanded_df[["id", "x", "date"]] # 打印结果 print(expanded_df)
关键说明
df.index.repeat(13)实现每条记录重复13行groupby("id").cumcount()+1为每个id的13行生成连续序号- 用
timedelta计算日期偏移,dt.date提取日期部分
内容的提问来源于stack exchange,提问作者rezha nanda
相关产品推荐
相关产品推荐

