从固定时间开始以分钟为单位进行分组,无论第一行时间如何

问题描述 投票:0回答:1

我有这段代码,旨在计算 30 分钟间隔内发生的次数;要求是在固定的起点(每小时的 00 分钟和 30 分钟)设置这些间隔。遗憾的是,尽管我尽了一切努力,第二组还是与第 03 分钟和第 33 分钟对齐。

我怀疑这两个组都与第一个时间行对齐,并且第一个组只是偶然正确的。我如何告诉石斑鱼强制对齐到 00 和 30 分钟?

df_long_forecast = df_merged[df_merged['forecast'] == 'long']

df_long_forecast['after_12_max_time'] = (
    df_long_forecast['after_12_max_datetime']
    - df_long_forecast['after_12_max_datetime'].dt.normalize()
)  # timedelta64[ns]

hist_max = df_long_forecast.groupby(
    pd.Grouper(key='after_12_max_time', freq='30T',  offset='0T', origin='epoch')
)['Date'].count()
percent_max = round(hist_max / hist_max.sum() * 100, 2)
display(hist_max)

df_long_forecast_profit = df_long_forecast[
    df_long_forecast['after_12_max_>_9_to_12_high'] > 0
]
profit_long = df_long_forecast_profit.groupby(
    pd.Grouper(key='after_12_max_time', freq='30T',  offset='0T', origin='epoch')
)['Date'].count()
percent_profit_long = round(profit_long / hist_max.sum() * 100, 2)
display(profit_long)
after_12_max_time
0 days 12:00:00    24
0 days 12:30:00     5
0 days 13:00:00     7
0 days 13:30:00     5
0 days 14:00:00     5
0 days 14:30:00     4
0 days 15:00:00     4
0 days 15:30:00     1
0 days 16:00:00     5
0 days 16:30:00     7
0 days 17:00:00     1
0 days 17:30:00     6
0 days 18:00:00     1
0 days 18:30:00     1
0 days 19:00:00     1
0 days 19:30:00     6
0 days 20:00:00     3
0 days 20:30:00     0
0 days 21:00:00     6
0 days 21:30:00    19
0 days 22:00:00     8
Freq: 30T, Name: Date, dtype: int64


after_12_max_time
0 days 12:03:00     8
0 days 12:33:00     4
0 days 13:03:00     5
0 days 13:33:00     4
0 days 14:03:00     5
0 days 14:33:00     4
0 days 15:03:00     3
0 days 15:33:00     2
0 days 16:03:00     5
0 days 16:33:00     6
0 days 17:03:00     2
0 days 17:33:00     5
0 days 18:03:00     1
0 days 18:33:00     2
0 days 19:03:00     0
0 days 19:33:00     5
0 days 20:03:00     3
0 days 20:33:00     0
0 days 21:03:00     6
0 days 21:33:00    21
0 days 22:03:00     3
Freq: 30T, Name: Date, dtype: int64

编辑1

完整数据集可以从此链接下载为 CSV 文件,并在上面的第一行代码之后导入,可以忽略。

python pandas group-by time-series pd.grouper
1个回答
0
投票

您面临的问题是由于

origin
函数中的
pd.Grouper
参数造成的。 origin 参数设置分组间隔的起点。 当它设置为
epoch
时,它从Unix纪元时间(1970-01-01 00:00:00)开始。如果您的数据与此不一致,您的时间间隔将会出现偏移。

您可以将原点设置为与这些分钟一致的时间戳。

origin = pd.Timestamp('1970-01-01 00:00:00') 

hist_max = df_long_forecast.groupby(pd.Grouper(key='after_12_max_time', freq='30T', offset='0T', origin=origin))['Date'].count()
percent_max = round(hist_max / hist_max.sum() * 100, 2)

df_long_forecast_profit = df_long_forecast[df_long_forecast['after_12_max_>_9_to_12_high'] > 0]
profit_long = df_long_forecast_profit.groupby(pd.Grouper(key='after_12_max_time', freq='30T', offset='0T', origin=origin))['Date'].count()
percent_profit_long = round(profit_long / hist_max.sum() * 100, 2)

这应该会在 30 分钟内为您提供计数。让我知道这是否有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.