Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将多天转换为每天?_Python_Python 3.x_Pandas - Fatal编程技术网

如何在python中将多天转换为每天?

如何在python中将多天转换为每天?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有以下数据帧: import pandas as pd dt = pd.DataFrame({'start_date': ['2019-05-20', '2019-05-21', '2019-05-21'], 'end_date': ['2019-05-23', '2019-05-24', '2019-05-22'], 'reg': ['A', 'B','A'],

我有以下
数据帧

import pandas as pd
    dt = pd.DataFrame({'start_date': ['2019-05-20', '2019-05-21', '2019-05-21'],
                       'end_date': ['2019-05-23', '2019-05-24', '2019-05-22'],
                       'reg': ['A', 'B','A'],
                       'measure': [100, 200,1000]})
我想创建一个名为“日期”的新列,该列的值从
start\u date
end\u date
,还有一个新列
measure\u daily
,该列将是
measure
在这些日期之间平均分布

基本上,我想用行来扩展dt

因此,我希望最终df如下所示:

   dt_f = pd.DataFrame({'date':['2019-05-20','2019-05-21','2019-05-22','2019-05-23','2019-05-21','2019-05-22','2019-05-23','2019-05-24', '2019-05-21','2019-05-22'],
                            'reg':['A','A','A','A','B','B','B','B','A','A'],
                             'measure_daily':[25,25,25,25,50,50,50,50,500,500]})
在python中有没有一种有效的方法来实现这一点?

TL;博士 给我一个解决方案:


细分: 首先,我们将您的
开始
结束日期
添加到同一列:

dt = dt.assign(key=dt.index)
melt = dt.melt(id_vars = ['reg', 'measure', 'key'], value_name='date').drop('variable', axis=1)

  reg  measure  key       date
0   A      100    0 2019-05-20
1   B      200    1 2019-05-21
2   A     1000    2 2019-05-21
3   A      100    0 2019-05-23
4   B      200    1 2019-05-24
5   A     1000    2 2019-05-22
然后我们每天在应用
groupby
的同时将不同的
reg
保留在各自的组中

melt = pd.concat(
    [d.set_index('date').resample('d').first().ffill() for _, d in melt.groupby(['reg', 'key'], sort=False)]
).reset_index()

        date reg  measure  key
0 2019-05-20   A    100.0  0.0
1 2019-05-21   A    100.0  0.0
2 2019-05-22   A    100.0  0.0
3 2019-05-23   A    100.0  0.0
4 2019-05-21   B    200.0  1.0
5 2019-05-22   B    200.0  1.0
6 2019-05-23   B    200.0  1.0
7 2019-05-24   B    200.0  1.0
8 2019-05-21   A   1000.0  2.0
9 2019-05-22   A   1000.0  2.0
最后,我们将
measure
列分布在各组的
size
上,包括:


那么您想按行扩展数据帧吗?@Erfan是,exactly@Xcodebeginner这个问题有两个主要区别:它没有考虑日期范围,也没有推广这一措施equally@anky_91我编辑了初始的
dt
,以创建一个“可复制的最终结果”。A&B现在每人都有4天。你认为,有一种方法可以扩展这个解决方案,以防在同一区域内的日期重叠?在同一区域内重叠的日期会是什么样子?您的意思是,在数据集
上更远的某个地方,区域A
将再次显示重叠的日期@数量,没错@killswitch解决方案我认为这是最后一个问题,在数据帧下方的一个新的
reg
与相同的reg具有相同的
measure
值,但在数据帧的上方会发生这种情况吗@quantLast编辑,这将提供正确的输出,并在大数据帧上快速运行
melt = pd.concat(
    [d.set_index('date').resample('d').first().ffill() for _, d in melt.groupby(['reg', 'key'], sort=False)]
).reset_index()

        date reg  measure  key
0 2019-05-20   A    100.0  0.0
1 2019-05-21   A    100.0  0.0
2 2019-05-22   A    100.0  0.0
3 2019-05-23   A    100.0  0.0
4 2019-05-21   B    200.0  1.0
5 2019-05-22   B    200.0  1.0
6 2019-05-23   B    200.0  1.0
7 2019-05-24   B    200.0  1.0
8 2019-05-21   A   1000.0  2.0
9 2019-05-22   A   1000.0  2.0
melt.assign(measure = melt['measure'].div(melt.groupby(['reg', 'key'], sort=False)['reg'].transform('size'))).drop('key', axis=1)

        date reg  measure
0 2019-05-20   A     25.0
1 2019-05-21   A     25.0
2 2019-05-22   A     25.0
3 2019-05-23   A     25.0
4 2019-05-21   B     50.0
5 2019-05-22   B     50.0
6 2019-05-23   B     50.0
7 2019-05-24   B     50.0
8 2019-05-21   A    500.0
9 2019-05-22   A    500.0