在给定日期时间连续性的情况下,Pandas 输出日期、开始和结束时间以及事件状态
Posted
技术标签:
【中文标题】在给定日期时间连续性的情况下,Pandas 输出日期、开始和结束时间以及事件状态【英文标题】:Pandas output date, start and end time and event status given datetime continuity 【发布时间】:2022-01-22 18:01:43 【问题描述】:我有以下数据框:
Site
Date
2021-07-01 08:00:00 54
2021-07-01 09:00:00 23
2021-07-01 10:00:00 13
2021-07-01 11:00:00 23
2021-07-01 15:00:00 345
2021-07-01 16:00:00 313
2021-07-05 08:00:00 3
2021-07-05 09:00:00 31
2021-07-13 08:00:00 76
2021-07-13 09:00:00 34
2021-07-13 10:00:00 94
2021-07-13 11:00:00 55
2021-07-13 12:00:00 43
2021-07-13 13:00:00 423
2021-07-13 14:00:00 231
2021-07-13 15:00:00 23
2021-07-13 16:00:00 563
2021-07-13 17:00:00 424
我正在尝试获取事件的日期、开始和结束时间。条件是这样的:
-
如果时间连续性没有中断(如 2021-07-13),则从
08:00:00
到 17:00:00
是一整天的活动
如果时间连续性中断并且不像 2021-07-13 那样连续,这将是一个不完整的日事件
最终结果是这样的:
Start End Result
Date
2021-07-01 08:00:00 11:00:00 Incomplete
2021-07-01 15:00:00 16:00:00 Incomplete
2021-07-05 08:00:00 09:00:00 Incomplete
2021-07-13 08:00:00 17:00:00 Full
有没有一种简单的方法可以在 pandas 中执行此操作?
【问题讨论】:
【参考方案1】:用途:
#if necessary convert to DatetimeIndex
df.index = pd.to_datetime(df.index)
#create column Date
df = df.reset_index()
#test consecutive hours
df['g'] = df['Date'].diff().dt.total_seconds().div(3600).ne(1)
date = df['Date'].dt.date
#created groups
df['g'] = df.groupby(date)['g'].cumsum()
#get minimal and maximal per dates
df1 = (df.groupby([date, 'g'])
.agg(Start=('Date','min'),End=('Date','max'))
.reset_index(level=1, drop=True))
#convert to HH:MM:SS
df1['Start'] = df1['Start'].dt.strftime('%H:%M:%S')
df1['End'] = df1['End'].dt.strftime('%H:%M:%S')
#result column
df1['Result'] = np.where(df1['Start'].eq('08:00:00') &
df1['End'].eq('17:00:00'), 'Full','Incomplete')
print (df1)
Start End Result
Date
2021-07-01 08:00:00 11:00:00 Incomplete
2021-07-01 15:00:00 16:00:00 Incomplete
2021-07-05 08:00:00 09:00:00 Incomplete
2021-07-13 08:00:00 17:00:00 Full
替代time
s:
df.index = pd.to_datetime(df.index)
df = df.reset_index()
df['g'] = df['Date'].diff().dt.total_seconds().div(3600).ne(1)
date = df['Date'].dt.date
df['g'] = df.groupby(date)['g'].cumsum()
df1 = (df.groupby([date, 'g'])
.agg(Start=('Date','min'),End=('Date','max'))
.reset_index(level=1, drop=True))
df1['Start'] = df1['Start'].dt.time
df1['End'] = df1['End'].dt.time
from datetime import time
df1['Result'] = np.where(df1['Start'].eq(time(8,0,0)) &
df1['End'].eq(time(17,0,0)), 'Full','Incomplete')
print (df1)
Start End Result
Date
2021-07-01 08:00:00 11:00:00 Incomplete
2021-07-01 15:00:00 16:00:00 Incomplete
2021-07-05 08:00:00 09:00:00 Incomplete
2021-07-13 08:00:00 17:00:00 Full
【讨论】:
感谢 jezrael,它有效。你能解释一下#test consecutive hours
和#get minimal and maximal per dates
在这种情况下是如何工作的吗?将不胜感激,因为我正在努力理解。以上是关于在给定日期时间连续性的情况下,Pandas 输出日期、开始和结束时间以及事件状态的主要内容,如果未能解决你的问题,请参考以下文章