我有一个有4列的DF.我想根据日期、Start_Time和End_Time粘贴每个id的行.

我想把两次之间的15个间隔改成1.然后把它们贴在每个ID上. 例如,对于id 1,'2022-07-21 12:15:00 13:00:00',我想为12-13创建1,1,1,0,而所有其他值都应该为零.

我提供了如下df,您可以看到这一点.例如,id=1和2.我们没有2022-07-20的任何内容,所以我将所有 值为零.其他ID和日期也是如此.以下是DF:

df = pd.DataFrame()

df['id'] = [1, 1, 2, 2, 3]

df['date'] = ['2022-07-21','2022-07-22','2022-07-21','2022-07-22', '2022-07-20' ]

df['time_start'] = ['12:15:00','12:45:00','12:45:00','12:00:00','12:30:00' ]

df['end_start'] = ['13:00:00','13:00:00','13:00:00','13:00:00','13:00:00' ]
    

   id      date     time_start  end_start
    1   2022-07-21  12:15:00    13:00:00
    1   2022-07-22  12:45:00    13:00:00
    2   2022-07-21  12:45:00    13:00:00
    2   2022-07-22  12:00:00    13:00:00
    3   2022-07-20  12:30:00    13:00:00

下面是我想要的df:

df = pd.DataFrame()

df['id'] = [1, 2, 3]

df['d112:00:00'] = [ 0,0,0]
df['d112:15:00'] = [0,0,0]
df['d112:30:00'] = [0,0,1] 
df['d112:45:00'] = [0,0, 1]
df['d113:00:00'] = [0,0,0]
df['d212:00:00'] = [ 0,0,0]
df['d212:15:00'] = [1,0,0]
df['d212:30:00'] = [ 1,0,0]
df['d212:45:00'] = [ 1,1,0]
df['d213:00:00'] = [ 0,0,0]  
df['d312:00:00'] = [ 0,1,0]
df['d312:15:00'] = [ 0,1,0]
df['d312:30:00'] = [ 0,1,0]
df['d312:45:00'] = [ 1,1,0]
df['d313:00:00'] = [ 0,0,0]



id  d112:00:00  d112:15:00  d112:30:00  d112:45:00  d113:00:00  d212:00:00  d212:15:00  d212:30:00  d212:45:00  d213:00:00  d312:00:00  d312:15:00  d312:30:00  d312:45:00  d313:00:00
    1   0   0   0   0   0   0   1   1   1   0   0   0   0   1   0
    2   0   0   0   0   0   0   0   0   1   0   1   1   1   1   0
    3   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0

你能帮我拿一下吗?谢谢

推荐答案

您可以修改输入,用所需的范围计算crosstab,reindex:

step = pd.Timedelta('15min')

start = pd.to_datetime(df['date']+' '+df['time_start'])
end   = pd.to_datetime(df['date']+' '+df['end_start'])
idx = df.index.repeat(end.sub(start).div(step))
s = start.loc[idx]
s += s.groupby(level=0).cumcount().mul(step)

cols = [d for date in sorted(df['date'].unique())
        for d in pd.date_range(date+' 12:00', date+' 13:00', freq=step)]

out = (pd.crosstab(df.loc[idx, 'id'].values, s)
         .reindex(columns=cols, fill_value=0)
         .rename_axis(columns=None, index='id').reset_index()
      )

输出:

   id  2022-07-20 12:00:00  2022-07-20 12:15:00  2022-07-20 12:30:00  2022-07-20 12:45:00  2022-07-20 13:00:00  2022-07-21 12:00:00  2022-07-21 12:15:00  2022-07-21 12:30:00  2022-07-21 12:45:00  2022-07-21 13:00:00  2022-07-22 12:00:00  2022-07-22 12:15:00  2022-07-22 12:30:00  2022-07-22 12:45:00  2022-07-22 13:00:00
0   1                    0                    0                    0                    0                    0                    0                    1                    1                    1                    0                    0                    0                    0                    1                    0
1   2                    0                    0                    0                    0                    0                    0                    0                    0                    1                    0                    1                    1                    1                    1                    0
2   3                    0                    0                    1                    1                    0                    0                    0                    0                    0                    0                    0                    0                    0                    0                    0

Python相关问答推荐

如何计算部分聚合数据的统计数据

绘制系列时如何反转轴?

使用Python Cerberus初始化一个循环数据 struct (例如树)(v1.3.5)

Python无法在已导入的目录中看到新模块

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

使用GEKKO在简单DTE系统中进行一致初始化

如何处理嵌套的SON?

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

Pandas 在最近的日期合并,考虑到破产

如何删除索引过go 的lexsort深度可能会影响性能?' &>

如何访问所有文件,例如环境变量

Python库:可选地支持numpy类型,而不依赖于numpy

ODE集成中如何终止solve_ivp的无限运行

关于Python异步编程的问题和使用await/await def关键字

递归访问嵌套字典中的元素值

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

matplotlib + python foor loop

判断Python操作:如何从字面上得到所有decorator ?

查看pandas字符列是否在字符串列中

用fft计算指数复和代替求和来模拟衍射?