python-3.x - 在为数据框生成值时在函数中使用条件

标签 python-3.x pandas numpy

我必须创建一个包含列 start_date 和 end_date 的数据框,其中 end_date > start_date 使用随机生成日期值的函数。

我试过这样的:

Project = pd.DataFrame({'Name': np.random.choice(['Starbucks','Macdonalds', 'KFC', 'Maruti', 
                                                  'Honda','Mercedes', 'BMW', 'Reebok','Nike','Lee'],10),
                       'Start_Date':Project.apply(lambda row: gen_datetime(), axis = 1), 
                       'End_Date': Project.apply(lambda row: gen_datetime() where('End_Date' > 'Start_Date' ), axis = 1)}) 

我不知道如何使用条件语句:

def gen_datetime(min_year=2017, max_year=datetime.now().year):
    start = date(min_year, 10, 28)
    years = max_year - min_year + 1
    end = start + timedelta(days=365 * years)
    for i in range(10):
        random_date = start + (end - start) * random.random()
        return random_date

最佳答案

想法是通过添加随机 timedeltastart time 生成随机 end time:

N = 10
shift_end_date = 20
def gen_datetime(min_year=2017, max_year=datetime.now().year):
    start = date(min_year, 10, 28)
    years = max_year - min_year + 1
    end = start + timedelta(days=365 * years)
    dates = pd.date_range(start, end - timedelta(shift_end_date))
    return np.random.choice(dates, N)

names = ['Starbucks','Macdonalds', 'KFC', 'Maruti', 
         'Honda','Mercedes', 'BMW', 'Reebok','Nike','Lee']
Project = pd.DataFrame({'Name': np.random.choice(names,N),
                       'Start_Date':gen_datetime()})

days = pd.to_timedelta(np.random.randint(1, shift_end_date, size=N), unit='d')
Project['End_Date'] = Project['Start_Date'] + days
print(Project)
        Name Start_Date   End_Date
0     Maruti 2018-07-31 2018-08-13
1        KFC 2017-11-20 2017-11-21
2     Maruti 2018-07-22 2018-07-23
3     Reebok 2018-05-13 2018-05-15
4        KFC 2018-08-16 2018-08-29
5  Starbucks 2018-03-18 2018-03-23
6     Reebok 2018-02-13 2018-03-03
7        Lee 2018-04-26 2018-05-10
8     Reebok 2018-09-11 2018-09-15
9      Honda 2018-05-15 2018-05-19

改进的解决方案 - 函数返回开始和结束日期的数组,并在 to_datetime 中使用参数 origin , 需要 pandas 0.20.1+ :

N = 10
def gen_datetime(min_year=2017, max_year=datetime.now().year):
    start = pd.Timestamp(min_year, 10, 28)
    years = max_year - min_year + 1
    end = 365 * years
    #get random sorted 2d array for days from start date
    d = np.sort(np.random.randint(end, size=[2,N]), axis=0)
    #convert to datetime with origin parameter 
    a = pd.to_datetime(d[0], unit='D',
                      origin=start)
    b = pd.to_datetime(d[1], unit='D',
                      origin=start)
    #return both arrays together                  
    return a,b

#extract output to 2 variables
start, end = gen_datetime()
names = ['Starbucks','Macdonalds', 'KFC', 'Maruti', 
         'Honda','Mercedes', 'BMW', 'Reebok','Nike','Lee']
Project = pd.DataFrame({'Name': np.random.choice(names,N),
                       'Start_Date':start,
                       'End_Date':end}, columns=['Name','Start_Date','End_Date'])

print(Project)
         Name Start_Date   End_Date
0      Reebok 2017-11-20 2018-06-28
1        Nike 2018-06-12 2018-07-23
2      Reebok 2018-04-26 2018-07-06
3         BMW 2018-02-20 2018-07-14
4   Starbucks 2018-04-02 2018-09-10
5   Starbucks 2017-12-14 2018-03-29
6         Lee 2018-05-17 2018-09-13
7  Macdonalds 2017-11-01 2018-08-20
8      Reebok 2018-04-09 2018-06-27
9  Macdonalds 2018-02-21 2018-10-07

关于python-3.x - 在为数据框生成值时在函数中使用条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003784/

相关文章:

python - 在 pandas 的列匹配中替换另一个数据框中的 NaN 值的正确方法

python - 访问 statsmodels 中的各个参数

python - 如何迭代模糊比的最大值并导出到新的 CSV 文件

python - scrapy - 如何用 Pandas 数据框中的数据填充项目?

python - 如何在组内逐条查找唯一值?

python - 如果值大于则替换整个数组

python-3.x - ImportError :/usr/lib/aarch64-linux-gnu/libgomp. so.1: 无法在静态 TLS block 中分配内存

python - 在 Python 中使用 Pandas 进行特征工程,每次计算使用多行

python - 将数据帧的数据点转换为列

python - 获取数组中匹配元素的索引,考虑重复