Как получить промежуточные даты из диапазона дат в SQL и Pandas - PullRequest
0 голосов
/ 24 октября 2018

Ниже приведена таблица Sales, которая содержит следующие данные:

Продажи:

S_ID    S_QTY   S_PRD   S_ST_DT     S_END_DT
1       223     AA      2018-06-02  2018-06-04
2       442     FO      2018-05-10  2018-05-12
3       771     WA      2018-07-07  2018-07-10
4       663     AAG     2018-03-02  2018-03-03

Я пытаюсь получить даты между S_ST_DT и S_END_DT.Ожидается следующее O / P в DB2-SQL и Pandas:

Ожидаемое O / P:

S_ID    S_QTY   S_PRD   S_DT        
1       223     AA      2018-06-02
1       223     AA      2018-06-03
1       223     AA      2018-06-04
2       442     FO      2018-05-10
2       442     FO      2018-05-11
2       442     FO      2018-05-12
3       771     WA      2018-07-07
3       771     WA      2018-07-08
3       771     WA      2018-07-09
3       771     WA      2018-07-10
4       663     AAG     2018-03-02
4       663     AAG     2018-03-03

Есть предложения здесь?

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

DB2:

with a (S_ID, S_QTY, S_PRD, S_DT, S_END_DT) as (
select S_ID, S_QTY, S_PRD, S_ST_DT, S_END_DT from sales
  union all
select S_ID, S_QTY, S_PRD, S_DT + 1 day, S_END_DT from a where S_DT<S_END_DT
)
select S_ID, S_QTY, S_PRD, S_DT 
from a 
order by S_ID, S_DT;
0 голосов
/ 24 октября 2018
  1. Используйте pop и извлеките последние два столбца
  2. Вычислите диапазон дат, используя pd.date_range
  3. Измените ваши данные, используя np.repeat
  4. СоздатьdataFrame, выравнивает список дат и присваивает вновь созданный df

from itertools import chain
v = [pd.date_range(x, y) 
         for x, y in zip(df.pop('S_ST_DT'), df.pop('S_END_DT'))]

df = (pd.DataFrame(df.values.repeat([len(u) for u in v], axis=0), 
                  columns=df.columns)
        .assign(S_DT=list(chain.from_iterable(v))))
print(df)

   S_ID S_QTY S_PRD       S_DT
0     1   223    AA 2018-06-02
1     1   223    AA 2018-06-03
2     1   223    AA 2018-06-04
3     2   442    FO 2018-05-10
4     2   442    FO 2018-05-11
5     2   442    FO 2018-05-12
6     3   771    WA 2018-07-07
7     3   771    WA 2018-07-08
8     3   771    WA 2018-07-09
9     3   771    WA 2018-07-10
10    4   663   AAG 2018-03-02
11    4   663   AAG 2018-03-03
0 голосов
/ 24 октября 2018

Настройка заимствованного холода для v

from collections import ChainMap
d=dict(ChainMap(*map(dict.fromkeys, v, df.index)))
#df=df.reindex(d.values()).assign(DT=d.keys()).sort_index()
df.reindex(d.values()).assign(DT=d.keys()).sort_index()
Out[281]: 
   S_ID  S_QTY S_PRD         DT
0     1    223    AA 2018-06-03
0     1    223    AA 2018-06-04
0     1    223    AA 2018-06-02
1     2    442    FO 2018-05-10
1     2    442    FO 2018-05-12
1     2    442    FO 2018-05-11
2     3    771    WA 2018-07-09
2     3    771    WA 2018-07-08
2     3    771    WA 2018-07-07
2     3    771    WA 2018-07-10
3     4    663   AAG 2018-03-02
3     4    663   AAG 2018-03-03
0 голосов
/ 24 октября 2018

Понимание

pd.DataFrame(
    [t + [d] for *t, s, e in df.itertuples(index=False)
     for d in pd.date_range(s, e)],
    columns=df.columns[:-2].tolist() + ['S_DT']
)

    S_ID  S_QTY S_PRD       S_DT
0      1    223    AA 2018-06-02
1      1    223    AA 2018-06-03
2      1    223    AA 2018-06-04
3      2    442    FO 2018-05-10
4      2    442    FO 2018-05-11
5      2    442    FO 2018-05-12
6      3    771    WA 2018-07-07
7      3    771    WA 2018-07-08
8      3    771    WA 2018-07-09
9      3    771    WA 2018-07-10
10     4    663   AAG 2018-03-02
11     4    663   AAG 2018-03-03

Альтернативная итерация кортежа

pd.DataFrame(
    [t + [d] for *t, s, e in zip(*map(df.get, df))
     for d in pd.date_range(s, e)],
    columns=df.columns[:-2].tolist() + ['S_DT']
)

Если два столбца даты не заканчиваются, сделайте это заранее.

cols = ['S_ST_DT', 'S_END_DT']
df = df.drop(cols, 1).join(df[cols])

для Legacy Python (<= 2.7) </h3> pd.DataFrame( [t[:-2] + (d,) for t in zip(*map(df.get, df)) for d in pd.date_range(*t[-2:])], columns=df.columns[:-2].tolist() + ['S_DT'] )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...