Python 根据两个不同的范围生成日期
我有一个带有列的数据帧df:Python 根据两个不同的范围生成日期,python,pandas,numpy,Python,Pandas,Numpy,我有一个带有列的数据帧df: 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 18 15/09/2019 17 16/
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 18
15/09/2019 17
16/09/2019 18
17/09/2019 19
18/09/2019 20
19/09/2019 21
20/09/2019 22
21/09/2019 23
22/09/2019 24
23/09/2019 25
24/09/2019 26
25/09/2019 27
26/09/2019 28
27/09/2019 29
28/09/2019 30
29/09/2019 30
30/09/2019 30
我希望生成具有3列date_1、count、date_2的df2,以便:
根据计数生成日期_2。如果日期_1的计数为5,则数据帧中将有5个条目。此外,date_2还具有以下约束:
谢谢要定义的第一个函数是:
def getSample(rng, n):
siz = rng.size
return rng.sample(n = n, replace = n > siz)
它从rng返回n个元素的样本。
如果可能(所需的元件数量较少或相等
对于rng中的元素数量)样品无重复
第二个功能是:
def getDates(dat, n):
td1d = pd.Timedelta(1, 'D')
# Date ranges
rng1 = pd.Series(pd.date_range(dat - td1d * 30, dat - td1d * 11, freq='D'))
rng2 = pd.Series(pd.date_range(dat - td1d * 10, dat - td1d * 2, freq='D'))
# Numbers of dates
n2 = int(round(n * 0.7))
n1 = n - n2
return pd.concat([getSample(rng1, n1), getSample(rng2, n2)])\
.sort_values().reset_index(drop=True)
它:
- 生成日期范围[d-30:d-11]和[d-10:d-2]
- 计算要从每个范围中获取的元素数
- 从两个范围(所需大小)中获取样本,将它们连接起来, 排序并返回结果
def repl(row):
dat = row.Date_1
cnt = row['count']
return pd.DataFrame({'date_1': dat, 'count': cnt, 'date_2': getDates(dat, cnt)})
现在要做的最后一件事是应用此函数并关联结果:
df2 = pd.concat(df1.sort_values('Date_1').\
apply(repl, axis=1).tolist(), ignore_index=True)
注:如果[d-10:d-2]范围内的日期数超过
可用日期的数量,日期是重复的
从21:48:25Z开始编辑以下注释
您的构思失败:例如2019-09-28年的世界其他地区(需要30行)。
在[d-10:d-2]范围内,应该有21个日期
但是因为那里只有9个日期,那么:
- 我们只能从这个范围中选取9
- 因此剩余的21日期应取自第二个范围 ([d-30:d-11])
30个不同的日期,无论这两个子范围如何划分。日期2的70%值应在(日期1-10到日期1-2)的范围内,并且它们是唯一的,这一要求在某些情况下是不可能满足的。例如,对于2019年9月28日,您需要30个输出行。其中70%是21天,可供选择的日期只有9天。也许在这种情况下应该允许重复?@Valdi_-Bo,就像我在问题中提到的那样,在这种情况下,9个日期是存在的,其余的需要来自其他日期的范围。就像我提到的,如果30是计数,那么我们需要提供1个月的范围。我们在任何情况下都不需要为日期1、日期_2@Valdo_Bo谢谢你的回答,但是,我不明白为什么日期是代表日期?请将日期列为2019年9月28日。总共应该有30个日期,即:范围[d-10:d-2]中的21个。但该范围仅包含9个日期,因此不可能创建21个日期的样本而不重复。在这种情况下,我们选择范围1中的所有值,然后保留从范围2中获取的值。您检查了吗?但这种方式违反了70%的行应具有[d-10:d-2]范围中的日期2的原则。