首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在选择一个日期和一个小时之前,检查插槽的数目是否大于0?

在选择一个日期和一个小时之前,检查插槽的数目是否大于0?
EN

Stack Overflow用户
提问于 2021-12-29 17:41:02
回答 3查看 55关注 0票数 0

我正在建立一个疫苗接种预约程序,自动分配一个插槽给用户。这将构建表并将其保存到CSV文件中:

代码语言:javascript
运行
复制
import pandas

start_date = '1/1/2022'
end_date = '31/12/2022'
list_of_date = pandas.date_range(start=start_date, end=end_date)
df = pandas.DataFrame(list_of_date)
df.columns = ['Date/Time']
df['8:00'] = 100
df['9:00'] = 100
df['10:00'] = 100
df['11:00'] = 100
df['12:00'] = 100
df['13:00'] = 100
df['14:00'] = 100
df['15:00'] = 100
df['16:00'] = 100
df['17:00'] = 100
df.to_csv(r'C:\Users\Ric\PycharmProjects\pythonProject\new.csv')

这段代码从我们刚刚创建的CSV表中随机选择一个日期和一个小时的日期:

代码语言:javascript
运行
复制
import pandas
import random
from random import randrange
#randrange randomly picks an index for date and time for the user
random_date = randrange(365)
random_hour = randrange(10)
list = ["8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00"]
hour = random.choice(list)
df = pandas.read_csv('new.csv')
date=df.iloc[random_date][0]
# 1 is substracted from that cell as 1 slot will be assigned to the user
df.loc[random_date, hour] -= 1
df.to_csv(r'C:\Users\Ric\PycharmProjects\pythonProject\new.csv',index=False)
print(date)
print(hour)

我需要帮助,使程序检查它在那个日期选择的随机时间是否有空位。如果空缺槽数为0,我可以管理所需的while循环。不,我没有试过很多,因为我不知道该怎么做。

如果您要尝试运行代码,请记住更改保存和读取位置。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-29 18:10:39

我就是这样做的。我也把它弄干净了。

代码语言:javascript
运行
复制
import random

import pandas as pd

start_date, end_date = '1/1/2022', '31/12/2022'
hours = [f'{hour}:00' for hour in range(8, 18)]

df = pd.DataFrame(
    data=pd.date_range(start_date, end_date),
    columns=['Date/Time']
)

for hour in hours:
    df[hour] = 100

# 1000 simulations
for _ in range(1000):
    random_date, random_hour = random.randrange(365), random.choice(hours)
    
    # Check if slot has vacant slot
    if df.at[random_date, random_hour] > 0:
        df.at[random_date, random_hour] -= 1
    else:
        # Pass here, but you can add whatever logic you want
        # for instance you could give it the next free slot in the same day
        pass

print(df.describe())
票数 1
EN

Stack Overflow用户

发布于 2021-12-29 17:59:37

代码语言:javascript
运行
复制
import pandas
import random
from random import randrange

# randrange randomly picks an index for date and time for the user
random_date = randrange(365)
# random_hour = randrange(10) #consider removing this line since it's not used
lista = [# consider avoid using Python preserved names
    "8:00",
    "9:00",
    "10:00",
    "11:00",
    "12:00",
    "13:00",
    "14:00",
    "15:00",
    "16:00",
    "17:00",
]
hour = random.choice(lista)
df = pandas.read_csv("new.csv")
date = df.iloc[random_date][0]
# 1 is substracted from that cell as 1 slot will be assigned to the user
if df.loc[random_date, hour] > 0:#here is what you asked for
    df.loc[random_date, hour] -= 1
else:
    print(f"No Vacant Slots in {random_date}, {hour}")
df.to_csv(r"new.csv", index=False)
print(date)
print(hour)
票数 1
EN

Stack Overflow用户

发布于 2021-12-29 18:15:50

还有另一种选择。我不确定你真的需要这个非常大的和慢负荷的熊猫模块。这是用plan Python结构完成的。我试着运行这个模拟,直到它失败为止,但是有36.5万个打开的插槽,每次将数据库刷新到磁盘上,花费的时间太长了。我把100改为8,只是为了看它在合理的时间内找到一个dup。

代码语言:javascript
运行
复制
import csv
import datetime
import random

def create():
    start = datetime.date( 2022, 1, 1 )
    oneday = datetime.timedelta(days=1)
    headers = ["date"] + [f"{i}:00" for i in range(8,18)]
    data = []
    for _ in range(365):
        data.append( [start.strftime("%Y-%m-%d")] + [8]*10 ) # not 100
        start += oneday
    write( headers, data )

def write(headers, rows):
    fcsv = csv.writer(open('data.csv','w',newline=''))
    fcsv.writerow( headers )
    fcsv.writerows( rows )

def read():
    days = []
    headers = []
    for row in csv.reader(open('data.csv')):
        if not headers:
            headers = row
        else:
            days.append( [row[0]] + list(map(int,row[1:])))
    return headers, days

def choose( headers, days ):
    random_date = random.randrange(365)
    random_hour = random.randrange(len(headers)-1)+1

    choice = days[random_date][0] + " " + headers[random_hour]
    print( "Chose", choice )
    if days[random_date][random_hour]:
        days[random_date][random_hour] -= 1
        write(headers,days)
        return choice
    else:
        print("Randomly chosen slot is full.")
        return None

create()
data = read()
while choose( *data ):
    pass
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70523007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档