2011-01-21 22 views
7

En Python puede seleccionar una fecha aleatoria de un año. p.ej. si el año fue 2010, una fecha devuelta podría ser 15/06/2010Python seleccione fecha aleatoria en el año actual

+6

Aquí hay una fecha aleatoria para usted: 2010-08-22. Ahora no tiene que generar uno en el código. ;) Oh, te refieres a una diferente cada vez. –

Respuesta

19

Es mucho más fácil de usar fechas ordinales (según la cual la fecha de hoy es 734158):

from datetime import date 
import random 

start_date = date.today().replace(day=1, month=1).toordinal() 
end_date = date.today().toordinal() 
random_day = date.fromordinal(random.randint(start_date, end_date)) 

Esto se producirá un error de fechas antes 1AD.

+1

+1 ¡Muy limpio! No sabía qué fechas ordinales era antes :-) Claramente mejor y más bonita que mi solución timstamp, que tiene limitaciones aún mayores en "fechas anteriores" ... – plundra

+1

La pregunta era "fecha aleatoria de un año", no entre 1 de enero y hoy. – AndiDog

+3

Pero el título era "seleccionar fecha aleatoria en el año actual". Para obtener una fecha aleatoria en un año arbitrario, solo tiene que calcular diferentes fechas de inicio y finalización, por ejemplo: 'start_date = date (day = 1, month = 1, year = MY_YEAR) .toordinal() ' y 'end_date = date (día = 31, mes = 12, año = MY_YEAR) .toordinal() '. –

3

No directamente, pero podría agregar un número aleatorio de días hasta el 1 de enero. Supongo que el siguiente debería funcionar para el calendario gregoriano:

from datetime import date, timedelta 
import random 
import calendar 

# Assuming you want a random day of the current year 
firstJan = date.today().replace(day=1, month=1) 

randomDay = firstJan + timedelta(days = random.randint(0, 365 if calendar.isleap(firstJan.year) else 364)) 
+2

Agradable. De hecho, hay una función 'isleap()' en el módulo 'calendar', que te permitirá guardarla definiéndolo tú mismo. –

+0

@Daniel: Gracias, tienes razón. Aprendiendo algo nuevo todos los días en SO :) No he usado mucho el módulo de calendario (todavía). Editado mi respuesta. – AndiDog

1
import datetime, time 
import random 

def year_start(year): 
    return time.mktime(datetime.date(year, 1, 1).timetuple()) 

def rand_day(year): 
    stamp = random.randrange(year_start(year), year_start(year + 1)) 
    return datetime.date.fromtimestamp(stamp) 

Editar: fechas ordinales como se utiliza en respuesta a Michael Dunn son mejor manera de utilizar las marcas de tiempo a continuación! Sin embargo, uno podría querer combinar el uso de ordinales con esto.

0
import calendar 
import datetime 
import random 

def generate_random_date(future=True, years=1): 
    today = datetime.date.today() 

    #Set the default dates 
    day = today.day 
    year = today.year 
    month = today.month 

    if future: 
     year = random.randint(year, year + years) 
     month = random.randint(month, 12) 

     date_range = calendar.monthrange(year, month)[1] #dates possible this month 
     day = random.randint(day + 1, date_range) #1 day in the future 
    else: 
     year = random.randint(year, year - years) 
     month = random.randint(1, month) 
     day = random.randint(1, day - 1) 

    return datetime.date(year, month, day)