Pandas 想要创建一个“每日”;开放式;特征来源于:MO 00:00-23:59 TU 00:00-23:59等
我有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来搜索和做一些事情。希望有人认识到这个问题 数据帧1Pandas 想要创建一个“每日”;开放式;特征来源于: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
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')