通过在两个现有列之间插入日期来创建每周时间序列

时间:2018-08-06 08:02:58

标签: python pandas dataframe

如何使用熊猫将“源数据框”转换为“目标数据框”?

源数据框的datefrom和dateto是日期范围,我希望将其转换为每周的日期范围,如结果“目标数据框”。

源数据框

DateFrom    DateTo      Catalog  Score
2017-05-01  2017-05-21  ABC      20
2017-05-22  2017-06-04  WXY      30

目标日期框架

DateFrom    DateTo      Catalog  Score
2017-05-01  2017-05-07  ABC      20
2017-05-08  2017-05-14  ABC      20
2017-05-15  2017-05-21  ABC      20
2017-05-22  2017-05-28  WXY      30
2017-05-29  2017-06-04  WXY      30

2 个答案:

答案 0 :(得分:0)

使用melt对齐DateFromDateTo,然后groupby(Catalog)上的resampleDateTo进行正向填充。
使用DateFrom重建TimeDelta

melted = pd.melt(df, id_vars=["Catalog", "Score"], var_name="x", value_name="DateTo")

df2 = (
    melted.set_index(pd.to_datetime(melted.DateTo))
     .drop(["x", "DateTo"],1)
     .groupby("Catalog", as_index=False)
     .resample("W")
     .ffill()
     .reset_index(level=1)
)

df2["DateFrom"] = df2.DateTo - pd.Timedelta("6 days")

输出:

df2[df.columns]
                   Catalog  Score
Catalog date                     
ABC     2017-05-07     ABC     20
        2017-05-14     ABC     20
        2017-05-21     ABC     20
WXY     2017-05-28     WXY     30
        2017-06-04     WXY     30

数据:

df
     DateFrom      DateTo Catalog  Score
0  2017-05-01  2017-05-21     ABC     20
1  2017-05-22  2017-06-04     WXY     30

答案 1 :(得分:0)

Expanding pandas data frame with date range in columns上扩展类似问题的答案,您可以按以下步骤遍历每一行并扩展数据框

import pandas as pd
from datetime import timedelta


newdf = pd.concat(
    [
        pd.DataFrame(
            {
                'DataFrom':
                pd.date_range(row.DateFrom, row.DateTo, freq='W-MON'),
                'DateTo':
                pd.date_range(
                    row.DateFrom + timedelta(days=6),
                    row.DateTo + timedelta(days=6),
                    freq='W'),
                'Catalog':
                row.Catalog,
                'Score':
                row.Score
            },
            columns=['DataFrom', 'DateTo', 'Catalog', 'Score'])
        for i, row in df.iterrows()
    ],
    ignore_index=True)

这将打印以下输出

newdf

    DataFrom    DateTo    Catalog   Score
0   2017-05-01  2017-05-07  ABC     20
1   2017-05-08  2017-05-14  ABC     20
2   2017-05-15  2017-05-21  ABC     20
3   2017-05-22  2017-05-28  WXY     30
4   2017-05-29  2017-06-04  WXY     30