【问题标题】:Want to create a daily "open" feature derived from : MO 00:00-23:59 TU 00:00-23:59 etc in phyton想要在 phyton 中创建一个每日“开放”功能:MO 00:00-23:59 TU 00:00-23:59 等
【发布时间】:2021-02-08 17:55:43
【问题描述】:

我可以使用 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 南美 00:00-23:59 南美 00:00-23:59

我想用它为每个日期单独创建一个功能。

为了给商店补货,我需要计划这次活动。我想使用创建的功能来验证补货的可能性。

我尝试过搜索和做拆分的东西,但没有成功。希望有人认识到这个问题?

数据框 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...

【问题讨论】:

  • 你能添加一个简单的输入和输出数据框吗?请参阅minimal reproducible exampleHow to Ask
  • @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 FR 08:00-20:00 SA 08:00-20:00 这是另一个.. 请注意 SU 不存在。
  • df 2 日期为 datetime64[ns]

标签: pandas dataframe date datetime


【解决方案1】:

这个有点奇怪,因为你的起始数据格式很奇怪,但没关系。

第一步是将天拆分成行,并根据星期几拆分行:

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'])

print(days)

    dayofweek   Open  Close     store
0 0       Mon  00:00  23:59  store a 
  1       Tue  00:00  23:59  store a 
1 0       Mon  00:00  23:59  store b 
  1       Tue  00:00  23:59  store b 
2 0       Mon  00:00  23:59  store c 
  1       Tue  00:00  23:59  store c 

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

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')

【讨论】:

  • 令人印象深刻!谢谢它的工作原理。我还在消化这个.. 下一步希望您愿意帮助我,我想将 xy 时间范围(IE 标准营业时间)与开-关进行比较,并添加 0 = 在 xy 期间关闭,1 = 在 xy 期间打开或 2 在 df2 的 xy 功能期间部分打开。最好是从 df3 mo-tu-we-thu-fri-sat-sun 得到 x-y,这样我以后可以调整。
  • @yordi 这是您需要帮助的更多核心数据建模,我会 1. 构建您的事实和维度表/数据框,然后合并并创建您的计算列。这里的标准营业时间在哪里?
  • 8:00-18:00 为标准营业时间
  • @yordi 查看编辑。如果它解决了您的问题,请不要忘记接受此答案
猜你喜欢
  • 2013-12-06
  • 2021-07-05
  • 2021-06-11
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多