Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据两个不同的范围生成日期_Python_Pandas_Numpy - Fatal编程技术网

Python 根据两个不同的范围生成日期

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/

我有一个带有列的数据帧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/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还具有以下约束:

  • 70%的值在(日期1-10到日期1-2)范围内
  • 剩余值的范围为(日期1-30到日期1-11)
  • 此外,date_1和date_2中的每一个都应该是唯一的元组,即没有重复的对(date_1,date_2)

    例如:

    对于第一行: 4日期_1的值应在范围1=(2019年9月1日-2019年8月22日至2019年9月1日-2019年8月30日)内,其余1的值应在范围2(2019年9月1日-2019年8月2日至2019年9月1日-2019年8月21日)内

    对于count=30的数据帧中的值,我们不需要进行此更改,因为我们需要唯一的值,并且由于date_2可以采用的总值是30,因此我们必须合并所有值。(在这种情况下,我们不能选择70%和30%)

    我无法理解如何基于这些因素特别设计数据帧。因此,对于count>11,它的所有值都应该在1(8个值)范围内。在此之前,它是范围1和范围2的70%和30%划分

    有人能帮我定义这些约束吗


    谢谢

    要定义的第一个函数是:

    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])
    但该范围仅包含20个日期,因此不可能 21从那里开始(没有重复)

    结论:你的要求被夸大了

    还有一句话:

    实际上,这项任务是不可能完成的,这一事实可以从表中看出 以下意见:

    日期范围[d-30:d-2]包含29个日期。 因此,不要期望从这个池中获得
    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的原则。