基于条件时间序列添加列pandas series

2024-04-23 20:32:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我从互联网上获取了一些数据,基本上是全年2列每小时的数据:

france.GetData(base_scenario, utils.enumerate_periods(start,end,'H','CET'))

输出

^{pr2}$

我想再添加两列基本上是“高峰”小时和一个“非高峰”小时刻度列。因此,如果一天中的时间是在8点到18点之间,那么在峰值列中会有1,如果在这些时间之外,在非高峰列中会有1。在

谁能解释一下怎么做吗。在

非常感谢


Tags: 数据base时间互联网utilsstartendscenario
1条回答
网友
1楼 · 发布于 2024-04-23 20:32:52

我认为您可以使用^{}如果不是DatetimeIndex,那么使用^{}来列peak,并测试^{}-如果NaN得到False,如果某个值得到{}。然后布尔值由^{}转换为intFalse->;0和{}->;1),最后一个从列peak得到{}(谢谢Quickbeam2k1):

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
^{pr2}$
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,对于反转掩码,请使用~

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

相关问题 更多 >