разделить временные ряды на 24 часа в пандах, но не в 00:00:00 - PullRequest
0 голосов
/ 18 октября 2019

с:

data = {'date':['2019-02-23 00:00:00', '2019-02-23 03:00:00', '2019-02-23 06:00:00', '2019-02-23 09:00:00', '2019-02-23 12:00:00', '2019-02-23 15:00:00', '2019-02-23 18:00:00', '2019-02-23 21:00:00', '2019-02-24 00:00:00', '2019-02-24 03:00:00', '2019-02-24 06:00:00', '2019-02-24 09:00:00', '2019-02-24 12:00:00', '2019-02-24 15:00:00', '2019-02-24 18:00:00', '2019-02-24 21:00:00'], 'foo':[1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18]} 
df = pd.DataFrame(data)

for bar in df.groupby(df.index.date):
    #doing some complex stuff with foo data

Я пытаюсь разделить эту серию времени по дням, но не в 00:00:00, как это делается как df.groupby(df.index.date) или df.groupby(pd.Grouper(freq='1D')), но, например, изС 10:00 до 10:00 следующего дняЯ пробовал Ioffset в Grouper, но меняются только метки.

=> Пожалуйста, есть ли хороший способ сделать это?

Thxs.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Используйте Series.dt.hour + Series.shift, чтобы обнаружить изменение времени около 10. Затем, используя Series.cumsum, вы можете создать нужные вам группы.

Обратите внимание, что здесь вы использовали Series.le и Series.ge вместо простого Series.eq, поскольку там может не быть данных, гдевремя эквивалентно 10

df['date']=pd.to_datetime(df['date'])
n=10
groups=(df['date'].dt.hour.ge(n)&df['date'].shift().dt.hour.le(n)).cumsum()
print(groups)

0     0
1     0
2     0
3     0
4     1
5     1
6     1
7     1
8     1
9     1
10    1
11    1
12    2
13    2
14    2
15    2
Name: date, dtype: int64

for i,group in df.groupby(groups):
    print(group)

                 date  foo
0 2019-02-23 00:00:00    1
1 2019-02-23 03:00:00    2
2 2019-02-23 06:00:00    3
3 2019-02-23 09:00:00    4
                  date  foo
4  2019-02-23 12:00:00    5
5  2019-02-23 15:00:00    6
6  2019-02-23 18:00:00    7
7  2019-02-23 21:00:00    8
8  2019-02-24 00:00:00   11
9  2019-02-24 03:00:00   12
10 2019-02-24 06:00:00   13
11 2019-02-24 09:00:00   14
                  date  foo
12 2019-02-24 12:00:00   15
13 2019-02-24 15:00:00   16
14 2019-02-24 18:00:00   17
15 2019-02-24 21:00:00   18
0 голосов
/ 18 октября 2019

В следующем примере будут сгруппированы строки по дате, начиная с 10 утра до 10 утра. Таким образом, группировка только по части даты этих измененных дат будет группировать строки с 10:00 текущей даты до 10:00 следующей даты

df["date"] = pd.to_datetime(df["date"])

df.groupby((df["date"] - pd.Timedelta(10, "H")).dt.date).apply(lambda g: g.assign(group=g.name))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...