Python 如何在列中的日期范围之间生成随机日期?

Python 如何在列中的日期范围之间生成随机日期?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个看起来像这样的df df: id dob 1 7/31/2018 2 6/1992 我想生成88799个随机日期进入数据框中的dob列,日期介于1960-01-01到1990-12-31之间,同时保持格式mm/dd/yyyy无时间戳 我该怎么做 我试过: date1 = (1960,01,01) date2 = (1990,12,31) for i range(date1,date2): df.dob = i 我会计算出您的日期范围内有多少天,然后选择该范

我有一个看起来像这样的df

df:

id   dob
1    7/31/2018
2    6/1992
我想生成88799个随机日期进入数据框中的dob列,日期介于1960-01-01到1990-12-31之间,同时保持格式mm/dd/yyyy无时间戳

我该怎么做

我试过:

date1 = (1960,01,01)
date2 = (1990,12,31)

for i range(date1,date2):
    df.dob = i

我会计算出您的日期范围内有多少天,然后选择该范围内的88799个随机整数,最后将其作为一个带有unit='d'的timedelta添加到您的最小日期:

min_date = pd.to_datetime('1960-01-01')
max_date = pd.to_datetime('1990-12-31')

d = (max_date - min_date).days + 1

df['dob'] = min_date + pd.to_timedelta(pd.np.random.randint(d,size=88799), unit='d')

>>> df.head()
         dob
0 1963-03-05
1 1973-06-07
2 1970-08-24
3 1970-05-03
4 1971-07-03

>>> df.tail()
             dob
88794 1965-12-10
88795 1968-08-09
88796 1988-04-29
88797 1971-07-27
88798 1980-08-03
编辑您可以使用.strftime“%m/%d/%Y”格式化日期,但请注意,这将显著降低执行速度:

df['dob'] = (min_date + pd.to_timedelta(pd.np.random.randint(d,size=88799), unit='d')).strftime('%m/%d/%Y')

>>> df.head()
          dob
0  02/26/1969
1  04/09/1963
2  08/29/1984
3  02/12/1961
4  08/02/1988
>>> df.tail()
              dob
88794  02/13/1968
88795  02/05/1982
88796  07/03/1964
88797  06/11/1976
88798  11/17/1965

我会计算出您的日期范围内有多少天,然后选择该范围内的88799个随机整数,最后将其作为一个带有unit='d'的timedelta添加到您的最小日期:

min_date = pd.to_datetime('1960-01-01')
max_date = pd.to_datetime('1990-12-31')

d = (max_date - min_date).days + 1

df['dob'] = min_date + pd.to_timedelta(pd.np.random.randint(d,size=88799), unit='d')

>>> df.head()
         dob
0 1963-03-05
1 1973-06-07
2 1970-08-24
3 1970-05-03
4 1971-07-03

>>> df.tail()
             dob
88794 1965-12-10
88795 1968-08-09
88796 1988-04-29
88797 1971-07-27
88798 1980-08-03
编辑您可以使用.strftime“%m/%d/%Y”格式化日期,但请注意,这将显著降低执行速度:

df['dob'] = (min_date + pd.to_timedelta(pd.np.random.randint(d,size=88799), unit='d')).strftime('%m/%d/%Y')

>>> df.head()
          dob
0  02/26/1969
1  04/09/1963
2  08/29/1984
3  02/12/1961
4  08/02/1988
>>> df.tail()
              dob
88794  02/13/1968
88795  02/05/1982
88796  07/03/1964
88797  06/11/1976
88798  11/17/1965

可以使用strftime将日期格式化为OPasked@sacul谢谢,我如何在飞行中设置日期格式?@sacuL。我可以核对几点吗?在pd.np.random.randint行中,我们需要包含pd.np.random.randint还是只写np.random.randint?当我加入pd时,我看不出我的结果有什么不同。或者不是。同样对于d=max\u date-min\u date.days+1行,您能在这里解释一下.days的用法吗?我知道我们使用天作为时间单位,因此在代码后面使用unit='d',但是我不完全理解为什么我需要包括天。这里d只是randint的最大整数值?如果我不包含代码,代码将失败。许多的thanks@mmTmmRpd.np.random.randint就在那里,这样您就不必通过import numpy作为np显式地导入numpy,但是如果您已经导入了numpy,那么它与说np.random.randint完全相同。对于d=max_date-min_date.days+1,这只是为了得到一个有效整数的列表。days给出了最大日期-最小日期范围内天数的整数。可以使用strftime将日期格式化为OPasked@sacul谢谢,我如何在飞行中设置日期格式?@sacuL。我可以核对几点吗?在pd.np.random.randint行中,我们需要包含pd.np.random.randint还是只写np.random.randint?当我加入pd时,我看不出我的结果有什么不同。或者不是。同样对于d=max\u date-min\u date.days+1行,您能在这里解释一下.days的用法吗?我知道我们使用天作为时间单位,因此在代码后面使用unit='d',但是我不完全理解为什么我需要包括天。这里d只是randint的最大整数值?如果我不包含代码,代码将失败。许多的thanks@mmTmmRpd.np.random.randint就在那里,这样您就不必通过import numpy作为np显式地导入numpy,但是如果您已经导入了numpy,那么它与说np.random.randint完全相同。对于d=max_date-min_date.days+1,这只是为了得到一个有效整数的列表。days给出最大日期-最小日期范围内天数的整数