def random_datetimes_or_dates(start, end, out_format='datetime', n=10):
'''
unix timestamp is in ns by default.
I divide the unix time value by 10**9 to make it seconds (or 24*60*60*10**9 to make it days).
The corresponding unit variable is passed to the pd.to_datetime function.
Values for the (divide_by, unit) pair to select is defined by the out_format parameter.
for 1 -> out_format='datetime'
for 2 -> out_format=anything else
'''
(divide_by, unit) = (10**9, 's') if out_format=='datetime' else (24*60*60*10**9, 'D')
start_u = start.value//divide_by
end_u = end.value//divide_by
return pd.to_datetime(np.random.randint(start_u, end_u, n), unit=unit)
def random_dates_2(start, end, n, freq, seed=None):
if seed is not None:
np.random.seed(seed)
dr = pd.date_range(start, end, freq=freq)
a = np.arange(len(dr))
b = np.sort(np.random.permutation(a)[:n])
return dr[b]
from datetime import datetime
import random
import numpy as np
import pandas as pd
N = 10 #N-samples
dates = np.zeros([N,3])
for i in range(0,N):
year = random.randint(1970, 2010)
month = random.randint(1, 12)
day = random.randint(1, 28)
#if you need to change it use variables :3
birth_date = datetime(year, month, day)
dates[i] = [year,month,day]
df = pd.DataFrame(dates.astype(int))
df.columns = ['year', 'month', 'day']
pd.to_datetime(df)
9条答案
按热度按时间inn6fuwd1#
转换为unix时间戳是否可以接受?
样品运行:
编辑:
根据@smci的评论,我写了一个函数来容纳1和2,并在函数本身中做了一些解释。
样品运行:
wfypjpf42#
np.random.randn
+to_timedelta
这解决了情况⑴。您可以通过生成
timedelta
对象的随机数组并将它们添加到start
日期来实现这一点。这也将生成带有时间组件的日期。
遗憾的是,
rand
不支持replace=False
,所以如果你想要唯一的日期,你需要一个两步的过程:1)生成非唯一的天组件,2)生成唯一的秒/毫秒组件,然后将两者相加。np.random.randint
+to_timedelta
这解决了情况(2)。你可以修改上面的
random_dates
来生成随机整数而不是随机浮点数:要生成具有其他频率的日期,可以使用
unit
的不同值调用上述函数。此外,您可以添加一个参数freq
,并根据需要调整函数调用。如果你想要 * 唯一 * 随机日期,你可以使用
np.random.choice
和replace=False
:性能
只对处理Case(1)的方法进行基准测试,因为Case(2)实际上是一个特殊的情况,任何方法都可以使用
dt.floor
。x1c 0d1x功能
标杆编码
jgzswidk3#
我们可以通过使用
datetime64
只是一个重新命名的int64
的事实来加速@akilat90的方法(在@coldspeed的基准测试中),因此我们可以查看-cast:li9yvcax4#
numpy.random.choice
你可以利用Numpy的随机选择。
choice
在大的data_ranges
上可能是有问题的。例如,太大将导致MemoryError。它需要存储整个东西,以便选择随机位。此外,这需要排序。
numpy.random.permutation
类似于其他答案。但是,我喜欢这个答案,因为它将
date_range
生成的datetimeindex
切片,并自动返回另一个datetimeindex
。dfty9e195#
只是我的两分钱,使用date_range和sample:
t9aqgxwy6#
我发现一个新的基础库生成的日期范围,似乎在我这边有点快比
pandas.data_range
,信贷从这个answeruelo1irk7#
这是另一种方法:D也许有人会需要它。
结果:
mjqavswn8#
我认为这是一个更简单的解决方案,只需在pandas DateFrame中创建日期字段
bnl4lu3b9#
我觉得下面这个被接受的答案更有可读性: