python - 如何为两列之间的所有日期添加行?

标签 python datetime pandas resampling melt

import pandas as pd

mydata = [{'ID' : '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016'},
          {'ID' : '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016'}]

mydata2 = [{'ID': '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016', 'Date': '10/10/2016'},
           {'ID': '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016', 'Date': '11/10/2016'},
           {'ID': '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016', 'Date': '12/10/2016'},
           {'ID': '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016', 'Date': '13/10/2016'},
           {'ID': '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016', 'Date': '14/10/2016'},
           {'ID': '10', 'Entry Date': '10/10/2016', 'Exit Date': '15/10/2016', 'Date': '15/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '10/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '11/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '12/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '13/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '14/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '15/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '16/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '17/10/2016'},
           {'ID': '20', 'Entry Date': '10/10/2016', 'Exit Date': '18/10/2016', 'Date': '18/10/2016'},]

df = pd.DataFrame(mydata)
df2 = pd.DataFrame(mydata2)

我找不到关于如何将“df”更改为“df2”的答案。也许我措辞不正确。

我想获取“进入日期”和“退出日期”两列中日期之间的所有日期,并为每个列创建一行,在新列“日期”中为每一行输入相应的日期。

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用 melt reshape ,set_index并删除 variable 列:

#convert columns to datetime
df['Entry Date'] = pd.to_datetime(df['Entry Date'])
df['Exit Date'] = pd.to_datetime(df['Exit Date'])

df2 = pd.melt(df, id_vars='ID', value_name='Date')
df2.Date = pd.to_datetime(df2.Date)
df2.set_index('Date', inplace=True)
df2.drop('variable', axis=1, inplace=True)
print (df2)
            ID
Date          
2016-10-10  10
2016-10-10  20
2016-10-15  10
2016-10-18  20

然后 groupbyresampleffill缺失值:

df3 = df2.groupby('ID').resample('D').ffill().reset_index(level=0, drop=True).reset_index()
print (df3)
         Date  ID
0  2016-10-10  10
1  2016-10-11  10
2  2016-10-12  10
3  2016-10-13  10
4  2016-10-14  10
5  2016-10-15  10
6  2016-10-10  20
7  2016-10-11  20
8  2016-10-12  20
9  2016-10-13  20
10 2016-10-14  20
11 2016-10-15  20
12 2016-10-16  20
13 2016-10-17  20
14 2016-10-18  20

最后merge原始DataFrame:

print (pd.merge(df, df3))
   Entry Date  Exit Date  ID       Date
0  2016-10-10 2016-10-15  10 2016-10-10
1  2016-10-10 2016-10-15  10 2016-10-11
2  2016-10-10 2016-10-15  10 2016-10-12
3  2016-10-10 2016-10-15  10 2016-10-13
4  2016-10-10 2016-10-15  10 2016-10-14
5  2016-10-10 2016-10-15  10 2016-10-15
6  2016-10-10 2016-10-18  20 2016-10-10
7  2016-10-10 2016-10-18  20 2016-10-11
8  2016-10-10 2016-10-18  20 2016-10-12
9  2016-10-10 2016-10-18  20 2016-10-13
10 2016-10-10 2016-10-18  20 2016-10-14
11 2016-10-10 2016-10-18  20 2016-10-15
12 2016-10-10 2016-10-18  20 2016-10-16
13 2016-10-10 2016-10-18  20 2016-10-17
14 2016-10-10 2016-10-18  20 2016-10-18

关于python - 如何为两列之间的所有日期添加行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39997063/

相关文章:

python - 当范围未知时,Pandas 按值范围分组

python - Flask 应用程序中的自定义路由

python - 在 mod_python 上部署 WSGI 应用程序

Python 使用 matplotlib 绘制大矩阵

azure - ADF - VARCHAR 列不需要的日期时间转换

c# - 从文件名获取日期时间

python - raw_input 占位符?

python - 将本地时间转换为祖鲁时间以便比较时间

python-3.x - 计算数据帧中时间样本内的最大数量值

Python str.contains 其他列相关的函数