我有重叠日期范围的数据,我想得到一个包含单个日期和加在一起的值的表。我目前正在尝试在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
答案 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')