如何从SQL和Pandas中的日期范围中获取日期

时间:2018-10-24 17:14:19

标签: python sql pandas datetime dataframe

下面是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_DTS_END_DT之间的日期。 在DB2-SQLPandas中期望以下O / P:

预期的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 :(得分:4)

理解力

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

对于旧版Python(<= 2.7)

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

答案 1 :(得分:4)

  1. 使用pop并提取最后两列
  2. 使用pd.date_range
  3. 计算日期范围
  4. 使用np.repeat
  5. 重塑数据
  6. 创建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

答案 2 :(得分:3)

借来的感冒为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

答案 3 :(得分:3)

DB2:

@media print {
    body{
        width: 100%;
        margin: 0;
        padding: 0;
    }

    img {
        max-width: 100%;
    }
    img {
        page-break-inside: avoid;
    }
}