【发布时间】:2019-11-03 14:58:07
【问题描述】:
我有一个数据框 df1,其中包含 date_1 列,其值从 01/09/2019 到 30/09/2019。即 30 个值和相应的计数。
DF1
date_1 count
01/09/2019 5
02/09/2019 4
03/09/2019 5
04/09/2019 6
05/09/2019 7
06/09/2019 8
07/09/2019 10
08/09/2019 9
09/09/2019 11
10/09/2019 12
11/09/2019 13
12/09/2019 14
13/09/2019 15
14/09/2019 16
我想使用带有一些约束的 df1 生成数据帧 df2:
有一个新列 date_2。
date_2 是根据 df1 中存在的计数特征生成的。
例如:一个新的数据框 df2 将有 5 个条目(因为 count = 5)用于 01/09/2019,并且 date_2 列可以采用 date_1 之前 30 天到 2019 年 8 月 30 日之间的值(date_1 中的当前日期 - 1 ) 即对于 01/09/2019,date_2 可以取的值是从 (01/09/2019 - 30 = 01/08/2019) 到 (01/09/2019 - 1 = 30/08/2019)。
date_2 可以从范围(30 - date_1 到 date_1 - 1)中随机选择,即在我们的示例中为 01/09/2019,从 02/08/2019 到 30/08/2019
需要注意的重要一点是 date_2 在 df2 中的计数也应该增加。
预期输出:
date_1 count date_2
01/09/2019 5 02/08/2019
01/09/2019 5 10/08/2019
01/09/2019 5 12/08/2019
01/09/2019 5 25/08/2019
01/09/2019 5 28/08/2019
02/09/2019 4 03/08/2019
02/09/2019 4 10/08/2019
02/09/2019 4 20/08/2019
02/09/2019 4 25/08/2019
编辑
我能够使用该函数生成 date_2 :
def pick_random_delta_in_range(min_days=1, max_days=30):
if min_days is None and max_days is None:
return datetime.timedelta(days=1, minutes=0, seconds=0)
if min_days is None:
return max_days
if max_days is None:
return min_days
days_to_be_added = random.randint(min_days, max_days)
return datetime.timedelta(days=days_to_be_added, minutes=0, seconds=0)
def gen_date_by_delta(src_dates, date_format, delta_min, delta_max):
gen_dates = []
for dt in src_dates:
src_date = datetime.datetime.strptime(dt, date_format)
if src_date is None:
gen_dates.append("")
continue
chosen_delta = pick_random_delta_in_range(min_days=delta_min, max_days=delta_max)
result_date = (src_date + chosen_delta).strftime(date_format)
gen_dates.append(result_date)
return gen_dates
date_2 = gen_date_by_delta(src_dates=df1["date_1"], date_format=date_format, delta_min=1, delta_max=30)
*当前增量是随机生成的,可能会为相同的 date_1 生成相同的增量,从而导致重复条目。我不想生成重复的条目。 *
我也无法理解如何根据计数复制数据框中的字段并相应地生成日期。
任何人都可以帮助/建议一种生成相同的方法。
谢谢
【问题讨论】: