基于熊猫的特定范围的随机日期

时间:2018-10-27 14:08:07

标签: python pandas date

我的main_csv.csv文件看起来像

Client_ID     Frequency
123AASD45         10
2345OPU78         9
763LKJ90          2

这里的频率是日期数,例如频率是10,则必须在第一季度的工作日内(2018年1月至2018年3月)满足10次客户要求 我想要的输出应该是

Client_ID    Dates_Reached
123AASD45      01/05/2018 /* random dates */
123AASD45      01/08/2018
 ...............

我应该使用循环还是其他更好的方法来做到这一点?我尝试过如下

df=read_csv('main_csv.csv',delimiter='|')

for rows in df:
    i=0
    #generate random date
    i=i+1
    if (i==df['Frequency']):
       break

1 个答案:

答案 0 :(得分:1)

首先,您需要定义一个date_range函数,该函数采用开始日期和结束日期以及样本的大小并返回样本。

import pandas as pd
df = pd.DataFrame({'client':['123AASD45', '2345OPU78', '763LKJ90'], 'frequency':[10,9,2]})

def date_range(n, start='1/1/2011', end='4/1/2011'):
    date_range = pd.date_range(start, end)
    return list(pd.Series(date_range).sample(n))

然后为每个客户分配日期样本并对其进行一些数据调整,以便可以与原始表联接。

df['dates'] = df['frequency'].apply(lambda x: date_range(x))
df_dates = df['dates'].apply(pd.Series).reset_index()
df_dates = df_dates.melt(id_vars='index').dropna().drop(['variable'], axis=1).set_index('index')

最后,假设每个客户只有一行,您将加入原始数据集。

df.join(df_dates)