在pandas中按24小时周期分割时间序列,但不是在00:00:00

mnemlml8  于 2023-11-15  发布在  其他
关注(0)|答案(3)|浏览(130)

使用:

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

字符串
我尝试按天拆分此时间序列,但不是像df.groupby(df.index.date)df.groupby(pd.Grouper(freq='1D'))那样在00:00:00拆分,而是从第二天的10:00到10:00拆分。我尝试在Grouper中拆分Ioffset,但它只更改标签。
=>拜托,有什么好办法吗?
谢谢。

utugiqy6

utugiqy61#

以下示例将按从上午10点到上午10点的日期对行进行分组
它所做的是它减去10小时的所有日期,这将改变时间到上午10时的第二天到当前一天。因此,分组只有日期的一部分,这改变了日期将分组行从上午10时当前日期到上午10时下一个日期

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))

字符串

b5lpy0ml

b5lpy0ml2#

使用Series.dt.hour + Series.shift检测10附近的时间变化。然后使用Series.cumsum您可以创建所需的组。
请注意,这里使用了Series.leSeries.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
jucafojl

jucafojl3#

我无法理解Dev Khadka的代码,所以我写了我自己的代码,它做了同样的事情,但更多的行:

def split_series_by_hour(
    series: pd.Series,
    split_hour: int,
    split_frequency='24H'
) -> list:

offset = pd.Timedelta(hours=split_hour)

series_offset = series.copy()
series_offset.index = series.index - offset

grouped = series_offset.groupby(pd.Grouper(freq=split_frequency))

# Now `grouped` is an iterable where each element is a tuple,
# the first item is the group label (the start of the group interval),
# the second item is the sub-series for that group.
# Shift the 'time' in the result back by the offset to get the original times

sub_series_list = []

for group_time, group in grouped:

    group.index += offset

    sub_series_list.append({'time': group_time + offset, 'sub_series': group})

return sub_series_list

字符串

相关问题