在给定日期时间连续性的情况下,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:0017: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

替代times:

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 输出日期、开始和结束时间以及事件状态的主要内容,如果未能解决你的问题,请参考以下文章

一个范围之间的美国假期的python列表

从给定日期提取日、月和年的最快方法是啥?

Pandas对Pyspark函数的迭代。

在 SQL 中为给定年份设置硬编码的日期和月份

有没有办法在不将 dtype 更改为对象的情况下将 NaT 附加到带有时区的 pandas 日期时间?

如何实现word中的表格内连续不断日期更新?