1、使用np.random.randint和to_datetime生成
np.random.randint
是NumPy库中的一个函数,用于生成指定范围内的随机整数。它可以接受多个参数来控制生成的随机数的范围和数量。
import pandas as pd
import numpy as np
def random_dates(start, end, n=10):
"""
生成在给定日期范围内的多个随机日期。
参数:
start (pd.Timestamp): 开始日期。
end (pd.Timestamp): 结束日期。
n (int): 要生成的随机日期数量,默认为10。
返回:
pd.DatetimeIndex: 包含随机生成的日期的 DatetimeIndex 对象。
"""
# 将日期转换为 Unix 时间戳(以秒为单位)
start_u = start.value // 10**9
end_u = end.value // 10**9
# 生成指定数量的随机整数,然后转换为日期时间格式
return pd.to_datetime(np.random.randint(start_u, end_u, n), unit='s')
# 示例使用
start = pd.to_datetime('2015-01-01') # 设置开始日期
end = pd.to_datetime('2018-01-01') # 设置结束日期
# 生成10个在2015年1月1日到2018年1月1日之间的随机日期
random_dates_list = random_dates(start, end)
# 输出生成的随机日期列表
print(random_dates_list)
或者
import pandas as pd
import numpy as np
def random_datetimes_or_dates(start, end, out_format='datetime', n=10):
"""
生成在给定日期范围内的多个随机日期或日期时间。
参数:
start (pd.Timestamp): 开始日期。
end (pd.Timestamp): 结束日期。
out_format (str): 输出格式,'datetime' 生成日期时间,其他值生成日期。
n (int): 要生成的随机日期或日期时间的数量,默认为10。
返回:
pd.DatetimeIndex: 包含随机生成的日期或日期时间的 DatetimeIndex 对象。
"""
# 根据输出格式选择时间单位和除数
(divide_by, unit) = (10**9, 's') if out_format == 'datetime' else (24 * 60 * 60 * 10**9, 'D')
# 将日期转换为指定单位的 Unix 时间戳
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)
# 示例使用
start = pd.to_datetime('2015-01-01') # 设置开始日期
end = pd.to_datetime('2018-01-01') # 设置结束日期
# 生成10个在2015年1月1日到2018年1月1日之间的随机日期时间
random_datetimes = random_datetimes_or_dates(start, end, out_format='datetime')
print("随机生成的日期时间:")
print(random_datetimes)
2、使用np.random.rand和to_timedelta生成
np.random.rand
是 NumPy 库中的一个函数,用于生成指定形状的随机数数组,这些随机数的值在 [0, 1) 区间内均匀分布。
import pandas as pd
import numpy as np
def random_dates(start, end, n, unit='D', seed=None):
"""
生成在给定日期范围内的多个随机日期时间。
参数:
start (pd.Timestamp): 开始日期。
end (pd.Timestamp): 结束日期。
n (int): 要生成的随机日期数量。
unit (str): 时间增量的单位,默认为天 ('D')。
seed (int): 随机种子,默认为 None。
返回:
pd.DatetimeIndex: 包含随机生成的日期时间的 DatetimeIndex 对象。
"""
# 如果没有提供随机种子,使用默认种子以保证可重复性
if seed is None:
np.random.seed(0)
# 计算开始日期和结束日期之间的天数
ndays = (end - start).days + 1
# 生成随机时间增量并加到开始日期上
return pd.to_timedelta(np.random.rand(n) * ndays, unit=unit) + start
# 示例使用
np.random.seed(0) # 设置全局随机种子
start = pd.to_datetime('2015-01-01') # 设置开始日期
end = pd.to_datetime('2018-01-01') # 设置结束日期
# 生成10个在2015年1月1日到2018年1月1日之间的随机日期时间
random_dates_list = random_dates(start, end, 10)
# 输出生成的随机日期时间列表
print(random_dates_list)
想要不重复的随机日期,可以用np.random.choice与replace=False:
import pandas as pd
import numpy as np
def random_dates2_unique(start, end, n, unit='D', seed=None):
if not seed: # from piR's answer
np.random.seed(0)
ndays = (end - start).days + 1
return start + pd.to_timedelta(
np.random.choice(ndays, n, replace=False), unit=unit
)
# 示例使用
np.random.seed(0) # 设置全局随机种子
start = pd.to_datetime('2015-01-01') # 设置开始日期
end = pd.to_datetime('2018-01-01') # 设置结束日期
# 生成10个在2015年1月1日到2018年1月1日之间的随机日期时间
random_dates_list = random_dates2_unique(start, end, 10)
# 输出生成的随机日期时间列表
print(random_dates_list)
3、使用numpy.random.choice生成
numpy.random.choice
是 NumPy 库中用于从一维数组中生成随机样本的函数。它可以用于从给定的数组中随机抽取元素,支持有放回和无放回的抽样。import pandas as pd
import numpy as np
def random_dates(start, end, n, freq, seed=None):
"""
生成在给定日期范围和频率内的多个随机日期。
参数:
start (str): 开始日期字符串。
end (str): 结束日期字符串。
n (int): 要生成的随机日期数量。
freq (str): 日期生成的频率(例如 'H' 表示每小时)。
seed (list[int] 或 int): 随机种子,默认为 None。
返回:
pd.DatetimeIndex: 包含随机生成的日期的 DatetimeIndex 对象。
"""
if seed is not None:
np.random.seed(seed)
# 生成指定频率的日期范围
dr = pd.date_range(start, end, freq=freq)
# 从日期范围中随机选择 n 个日期
return pd.to_datetime(np.sort(np.random.choice(dr, n, replace=False)))
# 示例使用
start_date = '2015-01-01' # 设置开始日期
end_date = '2018-01-01' # 设置结束日期
number_of_dates = 10 # 生成10个随机日期
frequency = 'H' # 频率设置为每小时
seed_value = [3, 1415] # 设置随机种子
# 生成10个在2015年1月1日到2018年1月1日之间的随机日期(每小时频率)
random_dates_list = random_dates(start_date, end_date, number_of_dates, frequency, seed=seed_value)
# 输出生成的随机日期列表
print(random_dates_list)
4、使用numpy.random.permutation生成
numpy.random.permutation
是 NumPy 库中的一个函数,用于生成一个序列的随机排列。这个函数在数据集的随机化、洗牌等场景中非常有用。
import pandas as pd
import numpy as np
def random_dates_2(start, end, n, freq, seed=None):
"""
在指定日期范围内,按照给定频率生成多个随机日期。
参数:
start (str): 开始日期,格式如 'YYYY-MM-DD'。
end (str): 结束日期,格式如 'YYYY-MM-DD'。
n (int): 要生成的随机日期数量。
freq (str): 日期生成的频率,例如 'H' 表示每小时。
seed (int or list[int]): 随机种子,默认为 None。如果给定,将保证结果可重复。
返回:
pd.DatetimeIndex: 包含随机生成的日期的 DatetimeIndex 对象。
"""
if seed is not None:
np.random.seed(seed)
# 生成指定频率的日期范围
dr = pd.date_range(start, end, freq=freq)
# 生成一个排列组合的数组并选择前 n 个进行排序
a = np.arange(len(dr))
b = np.sort(np.random.permutation(a)[:n])
# 返回生成的随机日期
return dr[b]
# 示例使用
start = '2015-01-01' # 设置开始日期
end = '2018-01-01' # 设置结束日期
n = 10 # 生成10个随机日期
freq = 'H' # 频率为每小时
seed = [3, 1415] # 设置随机种子
# 生成10个在2015年1月1日到2018年1月1日之间的随机日期,频率为每小时
random_dates_list = random_dates_2(start, end, n, freq, seed)
# 输出生成的随机日期列表
print(random_dates_list)