Создание цикла из 12 часов в датафрейме с индексом метки времени - PullRequest
1 голос
/ 01 ноября 2019
df['index_day'] = df.index.floor('d')

мой фрейм данных df.head

                     index_day      P2_Qa  ...     P2_Qcon       P2_m
2019-01-10 17:00:00 2019-01-10  93.599342  ...  107.673342  14.962424
2019-01-10 17:01:00 2019-01-10  90.833884  ...  104.658384  14.343642
2019-01-10 17:02:00 2019-01-10  90.907001  ...  104.601001  14.568892
2019-01-10 17:03:00 2019-01-10  93.579973  ...  107.115473  14.884902
2019-01-10 17:04:00 2019-01-10  93.688072  ...  107.168072  14.831412

Я зацикливаюсь на каждый день

for day, i in df.groupby('index_day'):
    sns.jointplot(x='P2_Tam', y='P2_Qa', data=i, kind='reg')
    j=j+1
    plt.savefig(j+'.png')

Это дает мне графики регрессии на один день 24 часа. Тем не менее, я хочу такие участки только для ночи. Цикл около 12 часов, где one night = one loop= 1 plot с 18:00 до 6 часов утра.

Однако я хочу сделать цикл с one loop = 18:00 till 6:00 of next day, а не one loop=24 hours of one day. Как мне это сделать?

1 Ответ

0 голосов
/ 01 ноября 2019

Я думаю, что вы можете сначала фильтровать по DataFrame.between_time только для ночей, а затем по 12H с base=6:

rng = pd.date_range('2017-04-03', periods=35, freq='H')
df = pd.DataFrame({'a': range(35)}, index=rng)  

df = df.between_time('18:00:01', '6:00')
print (df)
                      a
2017-04-03 00:00:00   0
2017-04-03 01:00:00   1
2017-04-03 02:00:00   2
2017-04-03 03:00:00   3
2017-04-03 04:00:00   4
2017-04-03 05:00:00   5
2017-04-03 06:00:00   6
2017-04-03 19:00:00  19
2017-04-03 20:00:00  20
2017-04-03 21:00:00  21
2017-04-03 22:00:00  22
2017-04-03 23:00:00  23
2017-04-04 00:00:00  24
2017-04-04 01:00:00  25
2017-04-04 02:00:00  26
2017-04-04 03:00:00  27
2017-04-04 04:00:00  28
2017-04-04 05:00:00  29
2017-04-04 06:00:00  30

for i, g in df.groupby(pd.Grouper(freq='12H', base=6, closed='right')):
    if not g.empty:
        print (g)

                     a
2017-04-03 00:00:00  0
2017-04-03 01:00:00  1
2017-04-03 02:00:00  2
2017-04-03 03:00:00  3
2017-04-03 04:00:00  4
2017-04-03 05:00:00  5
2017-04-03 06:00:00  6
                      a
2017-04-03 19:00:00  19
2017-04-03 20:00:00  20
2017-04-03 21:00:00  21
2017-04-03 22:00:00  22
2017-04-03 23:00:00  23
2017-04-04 00:00:00  24
2017-04-04 01:00:00  25
2017-04-04 02:00:00  26
2017-04-04 03:00:00  27
2017-04-04 04:00:00  28
2017-04-04 05:00:00  29
2017-04-04 06:00:00  30

РЕДАКТИРОВАТЬ:

Если хотите, через 12 часов после времени запуска выберите одно из возможных решений с помощью DataFrame.truncate:

rng = pd.date_range('2017-04-03', periods=35, freq='2H')
df = pd.DataFrame({'a': range(35)}, index=rng)  

dates = df.index.floor('d').unique() 

for s, e in zip(dates + pd.Timedelta(18, unit='H'), 
                dates + pd.Timedelta(30, unit='H')):
    df1 = df.truncate(s, e)
    if not df1.empty:
        print (df1)


                      a
2017-04-03 18:00:00   9
2017-04-03 20:00:00  10
2017-04-03 22:00:00  11
2017-04-04 00:00:00  12
2017-04-04 02:00:00  13
2017-04-04 04:00:00  14
2017-04-04 06:00:00  15
                      a
2017-04-04 18:00:00  21
2017-04-04 20:00:00  22
2017-04-04 22:00:00  23
2017-04-05 00:00:00  24
2017-04-05 02:00:00  25
2017-04-05 04:00:00  26
2017-04-05 06:00:00  27
                      a
2017-04-05 18:00:00  33
2017-04-05 20:00:00  34
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...