计算日期值是否出现在两个不同时间之间 python pandas
calculate if date value occurs between two different times python pandas
我正在尝试创建一个新列以确定行值是否为 "between business hours"。为此,我尝试使用时间函数。 如果有更简单的方法我就不用了
我有一个包含 'Date'、'StartHour'、[ 列的数据框=47=].
问题:
如果“日期”列中的时间介于“”之间,我想给出 'True' 或 'False' StartHour' 和'EndHour' 时间。
import pandas as pd
import numpy as np
#create dataframe with dates
d = {'Date': ['2016-11-17 05:01:45','2011-01-04 16:34:00','2011-01-05 09:25:45',
'2011-01-10 12:00:45','2011-01-14 07:05:45','2011-01-15 10:19:00',
'2011-01-17 13:59:45','2011-01-19 18:39:45','2011-01-22 06:19:45'],
'StartHour': ['16:00','16:00','16:00','16:00','16:00','16:00','16:00','16:00','16:00'],
'EndHour': ['10:00','10:00','10:00','10:00','10:00','10:00','10:00','10:00','10:00'],
'Station_ID': ['A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(data=d)
#convert date column to datetime
df['Date'] = df['Date'].values.astype('datetime64[ns]')
#************************
# set index to Date (need for 'between_time')
df = df.set_index('Date')
# run calculation for between time
df['between_business_hours'] = df.index.isin(df.between_time('16:00', '10:00', include_start=True, include_end=True).index)
df
我使用 between_time 函数计算了一个列,但这只允许我对开始时间和结束时间使用硬编码值。我想使用 'StartTime' 和 'EndTime' 列中的值。我可能通过使用 between_time 函数使这比需要的更困难。
我希望输出看起来像这样。
EndHour StartHour Station_ID between_business_hours
Date
2016-11-17 05:01:45 10:00 16:00 A True
2011-01-04 16:34:00 10:00 16:00 A True
2011-01-05 09:25:45 10:00 16:00 A True
2011-01-10 12:00:45 10:00 16:00 A False
2011-01-14 07:05:45 10:00 16:00 B True
2011-01-15 10:19:00 10:00 16:00 B False
2011-01-17 13:59:45 10:00 16:00 B False
2011-01-19 18:39:45 10:00 16:00 B True
2011-01-22 06:19:45 10:00 16:00 B True
感谢任何帮助
您不需要设置 index
df.Date.dt.strftime('%H:%M').between(df.StartHour,df.EndHour)
Out[297]:
0 False
1 True
2 True
3 True
4 False
5 True
6 True
7 True
8 False
dtype: bool
更新
l=[df.loc[[y],:].index.indexer_between_time(df.loc[y,'StartHour'],df.loc[y,'EndHour'])==0 for y in df.index]
df['New']=l
df.New=df.New.str[0].fillna(False)
df
EndHour StartHour Station_ID New
Date
2016-11-17 05:01:45 10:00 16:00 A True
2011-01-04 16:34:00 10:00 16:00 A True
2011-01-05 09:25:45 10:00 16:00 A True
2011-01-10 12:00:45 10:00 16:00 A False
2011-01-14 07:05:45 10:00 16:00 B True
2011-01-15 10:19:00 10:00 16:00 B False
2011-01-17 13:59:45 10:00 16:00 B False
2011-01-19 18:39:45 10:00 16:00 B True
2011-01-22 06:19:45 10:00 16:00 B True
我正在尝试创建一个新列以确定行值是否为 "between business hours"。为此,我尝试使用时间函数。 如果有更简单的方法我就不用了
我有一个包含 'Date'、'StartHour'、[ 列的数据框=47=].
问题:
如果“日期”列中的时间介于“”之间,我想给出 'True' 或 'False' StartHour' 和'EndHour' 时间。
import pandas as pd
import numpy as np
#create dataframe with dates
d = {'Date': ['2016-11-17 05:01:45','2011-01-04 16:34:00','2011-01-05 09:25:45',
'2011-01-10 12:00:45','2011-01-14 07:05:45','2011-01-15 10:19:00',
'2011-01-17 13:59:45','2011-01-19 18:39:45','2011-01-22 06:19:45'],
'StartHour': ['16:00','16:00','16:00','16:00','16:00','16:00','16:00','16:00','16:00'],
'EndHour': ['10:00','10:00','10:00','10:00','10:00','10:00','10:00','10:00','10:00'],
'Station_ID': ['A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(data=d)
#convert date column to datetime
df['Date'] = df['Date'].values.astype('datetime64[ns]')
#************************
# set index to Date (need for 'between_time')
df = df.set_index('Date')
# run calculation for between time
df['between_business_hours'] = df.index.isin(df.between_time('16:00', '10:00', include_start=True, include_end=True).index)
df
我使用 between_time 函数计算了一个列,但这只允许我对开始时间和结束时间使用硬编码值。我想使用 'StartTime' 和 'EndTime' 列中的值。我可能通过使用 between_time 函数使这比需要的更困难。
我希望输出看起来像这样。
EndHour StartHour Station_ID between_business_hours
Date
2016-11-17 05:01:45 10:00 16:00 A True
2011-01-04 16:34:00 10:00 16:00 A True
2011-01-05 09:25:45 10:00 16:00 A True
2011-01-10 12:00:45 10:00 16:00 A False
2011-01-14 07:05:45 10:00 16:00 B True
2011-01-15 10:19:00 10:00 16:00 B False
2011-01-17 13:59:45 10:00 16:00 B False
2011-01-19 18:39:45 10:00 16:00 B True
2011-01-22 06:19:45 10:00 16:00 B True
感谢任何帮助
您不需要设置 index
df.Date.dt.strftime('%H:%M').between(df.StartHour,df.EndHour)
Out[297]:
0 False
1 True
2 True
3 True
4 False
5 True
6 True
7 True
8 False
dtype: bool
更新
l=[df.loc[[y],:].index.indexer_between_time(df.loc[y,'StartHour'],df.loc[y,'EndHour'])==0 for y in df.index]
df['New']=l
df.New=df.New.str[0].fillna(False)
df
EndHour StartHour Station_ID New
Date
2016-11-17 05:01:45 10:00 16:00 A True
2011-01-04 16:34:00 10:00 16:00 A True
2011-01-05 09:25:45 10:00 16:00 A True
2011-01-10 12:00:45 10:00 16:00 A False
2011-01-14 07:05:45 10:00 16:00 B True
2011-01-15 10:19:00 10:00 16:00 B False
2011-01-17 13:59:45 10:00 16:00 B False
2011-01-19 18:39:45 10:00 16:00 B True
2011-01-22 06:19:45 10:00 16:00 B True