【问题标题】:How to generate random dates between date range inside pandas column?如何在熊猫列内的日期范围之间生成随机日期?
【发布时间】:2019-04-02 22:25:49
【问题描述】:

我的 df 看起来像这样

df:

id   dob
1    7/31/2018
2    6/1992

我想在 1960-01-01 到 1990-12-31 的日期之间生成 88799 个随机日期以进入数据框中的列 dob,同时保持格式 mm/dd/yyyy 没有时间戳。

我该怎么做?

我试过了:

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

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

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

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

    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按照OP的要求格式化日期
    • @sacul 谢谢,我怎么能即时格式化日期?
    • @sacuL。我可以检查几点吗?在 pd.np.random.randint 行中我们需要包含 pd.np.random.randint 还是我们可以只写 np.random.randint?当我包含 pd 时,我看不出结果有什么不同。或不。同样对于 d = (max_date - min_date).days + 1 行,你能解释一下 .days 的用法吗?我知道我们使用天作为时间单位(因此代码后面的 unit='d')但是我不完全理解为什么我需要在此处包含 .days,因为 d 只是 randint 的最大整数值?如果我不包含它,我的代码将失败。非常感谢
    • @mmTmmR pd.np.random.randint 存在只是为了让您不必通过import numpy as np 显式导入numpy,但这与说np.random.randint 完全相同if你已经导入了 numpy 。对于d = (max_date - min_date).days + 1,这只是为了获取有效整数列表。 .days 给出 max_date - min_date 范围内天数的整数
    猜你喜欢
    • 2018-11-06
    • 2017-04-21
    • 2011-12-11
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多