在两个日期之间添加值

时间:2019-05-01 15:43:11

标签: python pandas powerbi

我有重叠日期范围的数据,我想得到一个包含单个日期和加在一起的值的表。我目前正在尝试在PowerBI中清除我的数据,但也可以在python中进行操作,并在转换后导入文件(如果这样更容易)。任何帮助表示赞赏:)

当前我的数据如下: data

Date_1 | Date_2 | Path_Name | Value

5/1/2019 | 5/15/2019 | LIPA | 250

5/8/2019 | 5/10/2019 | LIPA | 250

5/8/2019 | 5/10/2019 | LIPA | 750

我希望我的输出像这样: output

Date | LIPA Value

5/1/2019 | 250

5/2/2019 | 250

5/3/2019 | 250

5/4/2019 | 250

5/5/2019 | 250

5/6/2019 | 250

5/7/2019 | 250

5/8/2019 | 1250

5/9/2019 | 1250

5/10/2019 | 1250

5/11/2019 | 250

5/12/2019 | 250

2 个答案:

答案 0 :(得分:0)

我建议使用pandas。首先,让我们重新创建原始数据框,然后使用datetime将日期列转换为pd.to_datetime()

import pandas as pd

df = pd.DataFrame({
    'Date_1': ['5/1/2019','5/8/2019','5/8/2019'],
    'Date_2': ['5/15/2019','5/10/2019','5/10/2019'],
    'Path_Name': ['LIPA','LIPA','LIPA'],
    'Value': [250,250,750]
})

df['Date_1'] = pd.to_datetime(df['Date_1'], format='%m/%d/%Y')
df['Date_2'] = pd.to_datetime(df['Date_2'], format='%m/%d/%Y')

现在我们有以下数据框:

      Date_1     Date_2 Path_Name  Value
0 2019-05-01 2019-05-15      LIPA    250
1 2019-05-08 2019-05-10      LIPA    250
2 2019-05-08 2019-05-10      LIPA    750

现在,我们通过将每一行扩展到一个新的数据框,然后将这些数据框连接在一起,最后按每个日期分组并按Value列的总和来进行分析:

expanded = pd.concat([
    pd.DataFrame({
        'Date': pd.date_range(row['Date_1'], row['Date_2']),
        'Path_Name': row['Path_Name'],
        'Value': row['Value']
    }, columns=['Date', 'Path_Name', 'Value']) 
for i, row in df.iterrows()]).groupby('Date').agg({'Value': 'sum'})

收益:

            Value
Date             
2019-05-01    250
2019-05-02    250
2019-05-03    250
2019-05-04    250
2019-05-05    250
2019-05-06    250
2019-05-07    250
2019-05-08   1250
2019-05-09   1250
2019-05-10   1250
2019-05-11    250
2019-05-12    250
2019-05-13    250
2019-05-14    250
2019-05-15    250

答案 1 :(得分:0)

我正在使用pd.date_range创建每行的日期列表,然后unnesting

df['List']=[pd.date_range(x,y) for x , y in zip(df['Date_1'],df['Date_2'])]
s=unnesting(df,['List']).groupby('List')['Value'].sum()
s
Out[981]: 
List
2019-05-01     250
2019-05-02     250
2019-05-03     250
2019-05-04     250
2019-05-05     250
2019-05-06     250
2019-05-07     250
2019-05-08    1250
2019-05-09    1250
2019-05-10    1250
2019-05-11     250
2019-05-12     250
2019-05-13     250
2019-05-14     250
2019-05-15     250
Name: Value, dtype: int64

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')