2024-04-23 20:32:52 发布
网友
我从互联网上获取了一些数据,基本上是全年2列每小时的数据:
france.GetData(base_scenario, utils.enumerate_periods(start,end,'H','CET'))
输出
我想再添加两列基本上是“高峰”小时和一个“非高峰”小时刻度列。因此,如果一天中的时间是在8点到18点之间,那么在峰值列中会有1,如果在这些时间之外,在非高峰列中会有1。在
谁能解释一下怎么做吗。在
非常感谢
我认为您可以使用^{}如果不是DatetimeIndex,那么使用^{}来列peak,并测试^{}-如果NaN得到False,如果某个值得到{}。然后布尔值由^{}转换为int(False->;0和{}->;1),最后一个从列peak得到{}(谢谢Quickbeam2k1):
DatetimeIndex
peak
NaN
False
int
0
1
df = pd.DataFrame({'col': {'2016-01-01 01:00:00+00:00': 20.59, '2016-01-01 07:00:00+00:00': 15.86, '2016-01-01 10:00:00+00:00': 15.86, '2016-01-01 09:00:00+00:00': 15.86, '2016-01-01 02:00:00+00:00': 16.81, '2016-01-01 03:00:00+00:00': 17.41, '2016-01-01 05:00:00+00:00': 15.86, '2016-01-01 04:00:00+00:00': 17.02, '2016-01-01 08:00:00+00:00': 15.86, '2015-12-31 23:00:00+00:00': 23.86, '2016-01-01 18:00:00+00:00': 15.86, '2016-01-01 06:00:00+00:00': 15.86, '2016-01-01 00:00:00+00:00': 22.39}}) print (df) col 2015-12-31 23:00:00+00:00 23.86 2016-01-01 00:00:00+00:00 22.39 2016-01-01 01:00:00+00:00 20.59 2016-01-01 02:00:00+00:00 16.81 2016-01-01 03:00:00+00:00 17.41 2016-01-01 04:00:00+00:00 17.02 2016-01-01 05:00:00+00:00 15.86 2016-01-01 06:00:00+00:00 15.86 2016-01-01 07:00:00+00:00 15.86 2016-01-01 08:00:00+00:00 15.86 2016-01-01 09:00:00+00:00 15.86 2016-01-01 10:00:00+00:00 15.86 2016-01-01 18:00:00+00:00 15.86
df['peak'] = df.between_time('08:00', '18:00') df['peak'] = df['peak'].notnull().astype(int) df['peak-off'] = -df['peak'] + 1 print (df) col peak peak-off 2015-12-31 23:00:00 23.86 0 1 2016-01-01 00:00:00 22.39 0 1 2016-01-01 01:00:00 20.59 0 1 2016-01-01 02:00:00 16.81 0 1 2016-01-01 03:00:00 17.41 0 1 2016-01-01 04:00:00 17.02 0 1 2016-01-01 05:00:00 15.86 0 1 2016-01-01 06:00:00 15.86 0 1 2016-01-01 07:00:00 15.86 0 1 2016-01-01 08:00:00 15.86 1 0 2016-01-01 09:00:00 15.86 1 0 2016-01-01 10:00:00 15.86 1 0 2016-01-01 18:00:00 15.86 1 0
另一种解决方案是,如果首先通过条件获得boolean掩码,然后将其转换为int,对于反转掩码,请使用~:
boolean
~
h1 = pd.datetime.strptime('08:00:00', '%H:%M:%S').time() h2 = pd.datetime.strptime('18:00:00', '%H:%M:%S').time() times = df.index.time mask = (times >= h1) & (times <= h2) df['peak'] = mask.astype(int) df['peak-off'] = (~mask).astype(int) print (df) col peak peak-off 2015-12-31 23:00:00 23.86 0 1 2016-01-01 00:00:00 22.39 0 1 2016-01-01 01:00:00 20.59 0 1 2016-01-01 02:00:00 16.81 0 1 2016-01-01 03:00:00 17.41 0 1 2016-01-01 04:00:00 17.02 0 1 2016-01-01 05:00:00 15.86 0 1 2016-01-01 06:00:00 15.86 0 1 2016-01-01 07:00:00 15.86 0 1 2016-01-01 08:00:00 15.86 1 0 2016-01-01 09:00:00 15.86 1 0 2016-01-01 10:00:00 15.86 1 0 2016-01-01 18:00:00 15.86 1 0
如果只有小时数据解决方案可以更简单-使用^{}作为掩码:
df.index = pd.to_datetime(df.index) print (df.index) h = df.index.hour mask = (h >= 8) & (h <= 18) df['peak'] = mask.astype(int) df['peak-off'] = (~mask).astype(int) print (df) col peak peak-off 2015-12-31 23:00:00 23.86 0 1 2016-01-01 00:00:00 22.39 0 1 2016-01-01 01:00:00 20.59 0 1 2016-01-01 02:00:00 16.81 0 1 2016-01-01 03:00:00 17.41 0 1 2016-01-01 04:00:00 17.02 0 1 2016-01-01 05:00:00 15.86 0 1 2016-01-01 06:00:00 15.86 0 1 2016-01-01 07:00:00 15.86 0 1 2016-01-01 08:00:00 15.86 1 0 2016-01-01 09:00:00 15.86 1 0 2016-01-01 10:00:00 15.86 1 0 2016-01-01 18:00:00 15.86 1 0
我认为您可以使用^{} 如果不是} 来列} -如果}。然后布尔值由^{} 转换为}->;}(谢谢Quickbeam2k1):
^{pr2}$DatetimeIndex
,那么使用^{peak
,并测试^{NaN
得到False
,如果某个值得到{int
(False
->;0
和{1
),最后一个从列peak
得到{另一种解决方案是,如果首先通过条件获得
boolean
掩码,然后将其转换为int
,对于反转掩码,请使用~
:如果只有小时数据解决方案可以更简单-使用^{} 作为掩码:
相关问题 更多 >
编程相关推荐