gpt4 book ai didi

python - 有没有办法在 python pandas 中将基于时间的事件划分为小时模板?

转载 作者:行者123 更新时间:2023-11-30 21:53:45 24 4
gpt4 key购买 nike

我有一个数据框,其中包含各种事件以及开始时间和结束时间。例如, enter image description here

我想要一个输出数据框,它是一个小时模板(列中的小时)和具有相同事件的不同行中的日期。并将相应时间和日期的值填充为“1”。

enter image description here

任何帮助将不胜感激。

最佳答案

您可以使用:

df = pd.DataFrame({
'Event':list('abc'),
'StartTime':['24-12-19 1:14','22-12-19 0:32','23-12-19 6:00'],
'EndTime':['24-12-19 6:00','24-12-19 4:32','24-12-19 16:00']
})

df[['StartTime','EndTime']] = df[['StartTime','EndTime']].apply(pd.to_datetime, dayfirst=True)

df1 = (df.melt('Event')
.set_index('value')
.groupby('Event')['Event']
.resample('H')
.count()
.reset_index(name='val')
.assign(val=1,
date=lambda x: x['value'].dt.date,
hour=lambda x: x['value'].dt.hour)
.set_index(['Event','date','hour'])['val']
.unstack(fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
)
<小时/>
print (df1)

Event date 0 1 2 3 4 5 6 7 ... 14 15 16 17 18 19 20 \
0 a 2019-12-24 0 1 1 1 1 1 1 0 ... 0 0 0 0 0 0 0
1 b 2019-12-22 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1
2 b 2019-12-23 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1
3 b 2019-12-24 1 1 1 1 1 0 0 0 ... 0 0 0 0 0 0 0
4 c 2019-12-23 0 0 0 0 0 0 1 1 ... 1 1 1 1 1 1 1
5 c 2019-12-24 1 1 1 1 1 1 1 1 ... 1 1 1 0 0 0 0

21 22 23
0 0 0 0
1 1 1 1
2 1 1 1
3 0 0 0
4 1 1 1
5 0 0 0

[6 rows x 26 columns]

说明:

  1. 首先将两列转换为日期时间 DataFrame.applyto_datetime
  2. reshape DataFrame.melt - 如此可能DataFrameGroupBy.resample每组
  3. 使用 DataFrame.assign 创建新列将 val 的所有值设置为 1,日期为 Series.dt.dateSeries.dt.hour
  4. 最后一次 reshape DataFrame.set_indexSeries.unstack
  5. 最后一些数据清理由 DataFrame.reset_indexDataFrame.rename_axis

编辑:

对于小时数的开始和结束,请使用类似的解决方案 - 小时数减去下限小时数 Series.dt.floor如果开始日期也减去 1,则使用 firstresample:

#changed times
df = pd.DataFrame({
'Event':list('abc'),
'StartTime':['24-12-19 1:20','22-12-19 0:30','23-12-19 6:00'],
'EndTime':['24-12-19 6:20','24-12-19 4:40','24-12-19 16:00']
})

df[['StartTime','EndTime']] = df[['StartTime','EndTime']].apply(pd.to_datetime, dayfirst=True)

f = lambda x: x['value'].sub(x['value'].dt.floor('H')).dt.total_seconds().div(3600)
df1 = (df.melt('Event')
.assign(h = f)
.assign(h = lambda x: x.h.mask(x.variable == 'StartTime', 1 - x.h))
.set_index('value')
.groupby('Event')['h']
.resample('H')
.first()
.fillna(1)
.reset_index(name='h')
.assign(date=lambda x: x['value'].dt.date,
hour=lambda x: x['value'].dt.hour)
.set_index(['Event','date','hour'])['h']
.unstack(fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
)
<小时/>
print (df1)
Event date 0 1 2 3 4 5 6 7 \
0 a 2019-12-24 0.0 0.666667 1.0 1.0 1.000000 1.0 0.333333 0.0
1 b 2019-12-22 0.5 1.000000 1.0 1.0 1.000000 1.0 1.000000 1.0
2 b 2019-12-23 1.0 1.000000 1.0 1.0 1.000000 1.0 1.000000 1.0
3 b 2019-12-24 1.0 1.000000 1.0 1.0 0.666667 0.0 0.000000 0.0
4 c 2019-12-23 0.0 0.000000 0.0 0.0 0.000000 0.0 1.000000 1.0
5 c 2019-12-24 1.0 1.000000 1.0 1.0 1.000000 1.0 1.000000 1.0

14 15 16 17 18 19 20 21 22 23
0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
1 ... 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
2 ... 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
3 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4 ... 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
5 ... 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

[6 rows x 26 columns]

EDIT1:想法是按分钟重新采样,然后汇总小时:

df = pd.DataFrame({
'Event':list('abc'),
'StartTime':['20-12-19 18:06','22-12-19 0:32','23-12-19 6:00'],
'EndTime':['20-12-19 18:07','24-12-19 4:32','24-12-19 16:00']
})
<小时/>
df[['StartTime','EndTime']] = df[['StartTime','EndTime']].apply(pd.to_datetime, dayfirst=True)

f = lambda x: x['value'].sub(x['value'].dt.floor('Min')).dt.total_seconds().div(60)
df1 = (df.melt('Event')
.assign(h = f)
.assign(h = lambda x: x.h.mask(x.variable == 'StartTime', 1 - x.h))
.set_index('value')
.groupby('Event')['h']
.resample('Min')
.first()
.fillna(1)
.reset_index(name='h')
.assign(date=lambda x: x['value'].dt.date,
hour=lambda x: x['value'].dt.hour)
.groupby(['Event','date','hour'])['h']
.sum()
.unstack(fill_value=0)
.div(60)
.reset_index()
.rename_axis(None, axis=1)
)
<小时/>
print (df1)
Event date 0 1 2 3 4 5 6 7 8 \
0 a 2019-12-20 0.000000 0.0 0.0 0.0 0.000000 0.0 0.0 0.0 0.0
1 b 2019-12-22 0.466667 1.0 1.0 1.0 1.000000 1.0 1.0 1.0 1.0
2 b 2019-12-23 1.000000 1.0 1.0 1.0 1.000000 1.0 1.0 1.0 1.0
3 b 2019-12-24 1.000000 1.0 1.0 1.0 0.533333 0.0 0.0 0.0 0.0
4 c 2019-12-23 0.000000 0.0 0.0 0.0 0.000000 0.0 1.0 1.0 1.0
5 c 2019-12-24 1.000000 1.0 1.0 1.0 1.000000 1.0 1.0 1.0 1.0

9 10 11 12 13 14 15 16 17 18 19 20 21 22 \
0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.016667 0.0 0.0 0.0 0.0
1 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.000000 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.000000 1.0 1.0 1.0 1.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.000000 0.0 0.0 0.0 0.0
4 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.000000 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.000000 0.0 0.0 0.0 0.0

23
0 0.0
1 1.0
2 1.0
3 0.0
4 1.0
5 0.0

关于python - 有没有办法在 python pandas 中将基于时间的事件划分为小时模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59540815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com