如何使用 Python 在兩個日期之間生成 k 個隨機日期?


在資料科學領域,生成隨機資料非常重要。從構建神經網路到預測、股票市場資料等,通常都包含日期作為引數之一。為了進行統計分析,我們可能需要在兩個日期之間生成隨機數。本文將介紹如何生成兩個給定日期之間的 k 個隨機日期。

使用 random 和 datetime 模組

datetime 是 Python 中用於處理時間的內建庫。另一方面,random 模組有助於生成隨機數。因此,我們可以結合 random 和 datetime 模組來生成兩個日期之間的隨機日期。

語法

random.randint(start, end, k)

這裡 random 指的是 Python 的 random 庫。randint 方法接受三個重要的引數:起始值、結束值和 k(元素數量)。起始值和結束值指定我們需要生成隨機數的範圍。k 定義我們需要生成的數字數量。

示例

在以下示例中,我們建立了一個名為 generate_random_dates 的函式,該函式將起始日期、結束日期和要生成的隨機日期數量作為引數。對於使用 random 模組的 k 個隨機數,我們將此數字加到起始日期,但在結束日期範圍內。

import random
from datetime import timedelta, datetime
def generate_random_dates(start_date, end_date, k):
    random_dates = []
    date_range = end_date - start_date
    for _ in range(k):
        random_days = random.randint(0, date_range.days)
        random_date = start_date + timedelta(days=random_days)
        random_dates.append(random_date)
    return random_dates
start_date = datetime(2023, 5, 25)
end_date = datetime(2023, 5, 31)
random_dates = generate_random_dates(start_date, end_date, 5)
print("The random dates generated are:")
for index, date in enumerate(random_dates):
    print(f"{index+1}. {date.strftime('%Y-%m-%d')}")

輸出

The random dates generated are:
1. 2023-05-27
2. 2023-05-26
3. 2023-05-27
4. 2023-05-25
5. 2023-05-29

使用 datetime 和雜湊方法

Python 中的雜湊函式生成一個固定長度的字串字元,稱為雜湊值。我們可以使用雜湊函式來引入隨機性。雜湊函式根據其輸入生成看似隨機的值。透過對日期範圍應用模運算,生成的雜湊值被限制在所需日期範圍內的可能值範圍內。

語法

hash(str(<some value>)) % <range of dates>

根據一些底層架構,雜湊函式可以接收字串並返回雜湊值。% 是模運算子,它計算值的餘數。這確保結果始終至少在所需的範圍內。

示例

在以下程式碼中,我們迭代了 k 次。我們使用雜湊函式來生成字串的雜湊值。接下來,我們對日期範圍進行了模運算,以確保資料位於特定的起始日期和結束日期內。我們將生成的隨機日期追加到名為 random_dates 的列表中。

from datetime import timedelta, datetime

def generate_random_dates(start_date, end_date, k):
   random_dates = []
   date_range = (end_date - start_date).days + 1

   for _ in range(k):
      random_days = hash(str(_)) % date_range
      random_date = start_date + timedelta(days=random_days)
      random_dates.append(random_date)

   return random_dates

# Example usage
start_date = datetime(2023, 5, 25)
end_date = datetime(2023, 5, 31)
random_dates = generate_random_dates(start_date, end_date, 5)

print("The random dates generated are:")
for index, date in enumerate(random_dates):
   print(f"{index+1}. {date.strftime('%Y-%m-%d')}")

輸出

The random dates generated are:
1. 2023-05-28
2. 2023-05-28
3. 2023-05-25
4. 2023-05-27
5. 2023-05-28

使用 NumPy 和 Pandas 庫

Numpy 和 Pandas 是 Python 中用於數學計算和資料分析的流行庫。NumPy 庫有一個 random 方法,我們可以使用它來生成隨機數。另一方面,我們可以使用 Pandas 庫來生成日期範圍。

語法

numpy.random.randint(start, end , size=<size of the output array> ,
dtype=<data type of the elements>, other parameters.....)

random 是 NumPy 庫的一個模組。randint 方法將起始值和結束值作為必需引數。它定義了我們需要查詢隨機數的數字範圍。size 定義輸出陣列的大小,dtype 表示元素的資料型別。

示例

在以下程式碼中,我們建立了一個名為 generate_random_dates 的函式,該函式將起始日期、結束日期和天數作為引數,並以列表的形式返回一系列隨機日期。我們使用 Pandas 庫初始化日期,並使用 Numpy 庫生成數字。

import numpy as np
import pandas as pd
def generate_random_dates(start_date, end_date, k):
   date_range = (end_date - start_date).days + 1
   random_days = np.random.randint(date_range, size=k)
   random_dates = pd.to_datetime(start_date) + pd.to_timedelta(random_days, unit='d')
   return random_dates
start_date = datetime(2021, 5, 25)
end_date = datetime(2021, 5, 31)
print("The random dates generated are:")
random_dates = generate_random_dates(start_date, end_date, 5)
for index,date in enumerate(random_dates):
   print(f"{index+1}. {date.strftime('%Y-%m-%d')}")

輸出

The random dates generated are:
1. 2021-05-26
2. 2021-05-27
3. 2021-05-27
4. 2021-05-25
5. 2021-05-27

使用 random 和 Arrow 庫

Arrow 是 Python 的一個庫。這提供了一種更好、更最佳化的方式來處理日期和時間。我們可以使用 arrow 的 get 方法以日期格式獲取時間,並使用 random 庫在起始日期和結束日期之間隨機獲取 k 個數字。

語法

arrow.get(date_string, format=<format of the date string> , tzinfo=<time
zone information>)

arrow 表示 Python 的 arrow 模組。date_string 表示我們需要解析的日期和時間字串。但是,它應該採用 arrow 模組可以識別的格式。format 定義 date_string 的格式。tzinfo 提供時區資訊。

示例

我們在以下程式碼中使用了 arrow 方法來生成隨機日期。我們定義了一個名為 generate_random_dates 的自定義函式。我們在函式內迭代了 k 次。我們對每次迭代都使用了 uniform 方法來生成隨機日期。我們將日期移動到隨機的一天,以便隨機日期落在範圍內。我們將日期追加到 random_dates 列表並返回該值。

import random
import arrow

def generate_random_dates(start_date, end_date, k):
   random_dates = []
   date_range = (end_date - start_date).days

   for _ in range(k):
      random_days = random.uniform(0, date_range)
      random_date = start_date.shift(days=random_days)
      random_dates.append(random_date)

   return random_dates
start_date = arrow.get('2023-01-01')
end_date = arrow.get('2023-12-31')
random_dates = generate_random_dates(start_date, end_date, 7)
print("The random dates generated are:")
for index,date in enumerate(random_dates):
    print(f"{index+1}. {date.strftime('%Y-%m-%d')}")

輸出

The random dates generated are:
1. 2023-02-05
2. 2023-10-17
3. 2023-10-08
4. 2023-04-18
5. 2023-04-02
6. 2023-08-22
7. 2023-01-01

結論

在本文中,我們討論瞭如何使用 Python 的不同庫在兩個給定日期之間生成隨機日期。在不使用任何內建庫的情況下生成隨機日期是一項繁瑣的任務。因此,建議使用這些庫和方法來執行此任務。我們可以使用 Date Time、Numpy pandas 等來生成隨機日期。這些程式碼不是方法等。

更新於: 2023年7月28日

2K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告