我有这段代码,旨在计算 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 文件,并在上面的第一行代码之后导入,可以忽略。
您面临的问题是由于
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 分钟内为您提供计数。让我知道这是否有帮助。