Pandas 想要创建一个“每日”;开放式;特征来源于:MO 00:00-23:59 TU 00:00-23:59等

Pandas 想要创建一个“每日”;开放式;特征来源于:MO 00:00-23:59 TU 00:00-23:59等,pandas,dataframe,date,datetime,Pandas,Dataframe,Date,Datetime,我有masterdata的开放时间,比如:MO 00:00-23:59 TU 00:00-23:59 WE 00:00-23:59 TH 00:00-23:59 FR 00:00-23:59 SA 00:00-23:59 SU 00:00-23:59 我想用它来分别为每个日期创建一个功能 为了重新进货,我需要计划这次活动。我想使用创建的特性来验证重新进货的可能性 我尝试过用split to Non来搜索和做一些事情。希望有人认识到这个问题 数据帧1 store | restock_hours s

我有masterdata的开放时间,比如:MO 00:00-23:59 TU 00:00-23:59 WE 00:00-23:59 TH 00:00-23:59 FR 00:00-23:59 SA 00:00-23:59 SU 00:00-23:59

我想用它来分别为每个日期创建一个功能

为了重新进货,我需要计划这次活动。我想使用创建的特性来验证重新进货的可能性

我尝试过用split to Non来搜索和做一些事情。希望有人认识到这个问题

数据帧1

store | restock_hours
store a | MO 00:00-23:59 TU 00:00-23:59 etc
store b | MO 00:00-23:59 TU 00:00-23:59 etc
store c | MO 00:00-23:59 TU 00:00-23:59 etc
数据帧2

store   | date       | forcast consumption | stock | open(for restock)
store a | 2019-06-11 | 1000                | 1500  | yes/no ??
store a | 2019-06-12 | 500                 | 500   | yes/no ??
store a | etc...

这是一个有点奇怪,因为您的起始数据是一个奇怪的格式,但没有关系

第一步是将日期拆分为行,并基于一周中的某一天拆分行

days = (
    df1["restock_hours"]
    .str.strip()
    .str.replace("(\D{2})(\s)", r"\1_") # this adds an `_` after a a weekday name and the following space.
    .str.split(" ", expand=True)
    .stack()
    .str.split("_", expand=True)
    .rename(columns={0 : 'dayofweek'})
)

days = days.join(
    days[1].str.split("-", expand=True).rename(columns={0: "Open", 1: "Close"})
).drop(1, 1)

repl_dict = {'MO' : 'Mon','TU' : 'Tue','WE' : 'Wed'} # you can complete this. 
days['dayofweek'] = days['dayofweek'].map(repl_dict)

days['store'] = days.index.get_level_values(0).map(df1['store'])

接下来,我们需要根据星期几进行合并,并在事实数据框中返回值

pd.merge(
    df2.assign(dayofweek=df2["date"].dt.strftime("%a")),
    days,
    on=["store", "dayofweek"],
    how="left",
)

      store       date  forcast consumption  stock open(for restock)  \
0  store a  2019-06-11                 1000   1500         yes/no ??   
1  store a  2019-06-12                  500    500         yes/no ??   

  dayofweek   Open  Close  
0       Tue  00:00  23:59  
1       Wed    NaN    NaN  
你在清理方面还有一点工作,但你的要求不是100%清楚,所以我不想假设


#编辑添加时间增量

要添加时间增量,首先需要创建一些日期时间对象。让我们在函数中执行此操作

def time_delta(input_dataframe,business_hour_start,
              business_hour_end):
    
    store_open = pd.to_datetime(input_dataframe['Open'],format='%H:%M')
    store_close = pd.to_datetime(input_dataframe['Close'],format='%H:%M')
    
    start = pd.to_datetime(business_hour_start,format='%H:%M')
    end = pd.to_datetime(business_hour_end,format='%H:%M')
    
    return start - store_open,  store_close - end

df3['start_delta'],df3['end_delta'] = time_delta(df3,'09:00','18:30')

您能添加一个简单的输入和输出数据框吗?请看,@Manakin,这更清楚吗。。隐马尔可夫模型。。格式出错。正确:MO 00:00-23:59 TU 00:00-23:59 WE 00:00-23:59 TH 00:00-23:59 FR 00:00-23:59 SA 00:00-23:59 SU 00:00-23:59=数据框架中的1个字段使其更完整,以便您可以查看存储之间的时间差异:MO 08:00-20:00 TU 08:00-20:00 WE 08:00-20:00 TH 08:00-20:00-20:00 SA 08:00这是另一个。。注意,SU不存在。df 2 date是datetime64[ns]令人印象深刻!Thx它能工作。我还在消化这个。。下一步希望您愿意帮助我,我想将x-y时间段(即标准营业时间)与开放-关闭时间段进行比较,并在df2中添加0=在x-y期间关闭,1=在x-y期间打开或2部分在x-y期间打开的功能。最好是从df3 mo tu获得x-y,我们周四周五周六太阳,这样我以后可以调整。@yordi这是更多的核心数据建模,您需要帮助,我会1。构建事实和维度表/数据框架,然后合并并创建计算列。这里的标准营业时间在哪里?8:00-18:00是标准营业时间hours@yordi请参见编辑。如果这个答案解决了你的问题,别忘了接受它
def time_delta(input_dataframe,business_hour_start,
              business_hour_end):
    
    store_open = pd.to_datetime(input_dataframe['Open'],format='%H:%M')
    store_close = pd.to_datetime(input_dataframe['Close'],format='%H:%M')
    
    start = pd.to_datetime(business_hour_start,format='%H:%M')
    end = pd.to_datetime(business_hour_end,format='%H:%M')
    
    return start - store_open,  store_close - end

df3['start_delta'],df3['end_delta'] = time_delta(df3,'09:00','18:30')