【发布时间】:2021-05-17 22:13:03
【问题描述】:
给定一个数据框:
import datetime
from pyspark.sql import Row
dataframe_rows = {
Row(id = "A", date = datetime.datetime(2015, 1, 18)),
Row(id = "A", date = datetime.datetime(2015, 2, 21)),
Row(id = "A", date = datetime.datetime(2015, 2, 22)),
Row(id = "A", date = datetime.datetime(2015, 6, 30)),
Row(id = "A", date = datetime.datetime(2017, 12, 31)),
Row(id = "B", date = datetime.datetime(2019, 1, 18)),
Row(id = "B", date = datetime.datetime(2019, 1, 21)),
Row(id = "B", date = datetime.datetime(2019, 2, 22)),
Row(id = "B", date = datetime.datetime(2019, 2, 28)),
Row(id = "B", date = datetime.datetime(2019, 12, 13)),
}
df_example = spark.createDataFrame(dataframe_rows).orderBy(["id", "date"], ascending=[1, 1])
所以
df_example.show()
产量
+---+-------------------+
| id| date|
+---+-------------------+
| A|2015-01-18 00:00:00|
| A|2015-02-21 00:00:00|
| A|2015-02-22 00:00:00|
| A|2015-06-30 00:00:00|
| A|2017-12-31 00:00:00|
| B|2019-01-18 00:00:00|
| B|2019-01-21 00:00:00|
| B|2019-02-22 00:00:00|
| B|2019-02-28 00:00:00|
| B|2019-12-13 00:00:00|
+---+-------------------+
我想要一个函数,该函数将从该 DataFrame 中采样行,以便每个样本之间存在指定的天数,并且每个 id 的最后一个日期是采样 DataFrame 中每个 id 的最后一个日期。
例如,在每个样本之间使用 14 天,
+---+-------------------+
| id| date|
+---+-------------------+
| A|2015-01-18 00:00:00|
| A|2015-02-22 00:00:00|
| A|2015-06-30 00:00:00|
| A|2017-12-31 00:00:00|
| B|2019-01-18 00:00:00|
| B|2019-02-28 00:00:00|
| B|2019-12-13 00:00:00|
+---+-------------------+
请注意,每个 id 的最后日期与原始 DataFrame 中的日期相同。
编辑:下面的解决方案适用于我提供的原始 DataFrame,但如果我更改它
from pyspark.sql import Row
dataframe_rows = {
Row(id = "A", date = datetime.datetime(2000, 11, 12)),
Row(id = "A", date = datetime.datetime(2000, 12, 13)),
Row(id = "A", date = datetime.datetime(2000, 12, 29)),
Row(id = "A", date = datetime.datetime(2000, 12, 30)),
Row(id = "A", date = datetime.datetime(2000, 12, 31)),
Row(id = "B", date = datetime.datetime(2002, 2, 18)),
Row(id = "B", date = datetime.datetime(2002, 2, 21)),
Row(id = "B", date = datetime.datetime(2002, 2, 27)),
Row(id = "B", date = datetime.datetime(2002, 2, 28)),
Row(id = "B", date = datetime.datetime(2002, 12, 13)),
}
df_example = spark.createDataFrame(dataframe_rows).orderBy(["id", "date"], ascending=[1, 1])
df_example.show()
屈服
+---+-------------------+
| id| date|
+---+-------------------+
| A|2000-11-12 00:00:00|
| A|2000-12-13 00:00:00|
| A|2000-12-29 00:00:00|
| A|2000-12-30 00:00:00|
| A|2000-12-31 00:00:00|
| B|2002-02-18 00:00:00|
| B|2002-02-21 00:00:00|
| B|2002-02-27 00:00:00|
| B|2002-02-28 00:00:00|
| B|2002-12-13 00:00:00|
+---+-------------------+
并应用我得到的代码
+---+----------+
| id| date|
+---+----------+
| A|2000-11-12|
| A|2000-12-13|
| A|2000-12-31|
| B|2002-02-27|
| B|2002-02-28|
| B|2002-12-13|
+---+----------+
我不确定为什么两个 2 月的日期都存在。我期待看到
+---+----------+
| id| date|
+---+----------+
| A|2000-11-12|
| A|2000-12-13|
| A|2000-12-31|
| B|2002-02-28|
| B|2002-12-13|
+---+----------+
有什么想法吗?
【问题讨论】:
标签: python dataframe apache-spark pyspark sampling