我想整合以下資料框,這樣我就有每小時的整合價值。我有大約 10 秒的采樣率,但如果需要有一個均勻的時間間隔,我想我可以使用df.resample().
Timestamp Power [W]
2022-05-05 06:00:05 02:00 2.0
2022-05-05 06:00:15 02:00 1.2
2022-05-05 06:00:25 02:00 0.3
2022-05-05 06:00:35 02:00 4.3
2022-05-05 06:00:45 02:00 1.1
...
2022-05-06 20:59:19 02:00 1.4
2022-05-06 20:59:29 02:00 2.0
2022-05-06 20:59:39 02:00 4.1
2022-05-06 20:59:49 02:00 1.3
2022-05-06 20:59:59 02:00 0.8
因此,我希望能夠在數小時和數天內進行集成,因此我的輸出可能如下所示:
Timestamp Energy [Wh]
2022-05-05 07:00:00 02:00 some values
2022-05-05 08:00:00 02:00 .
2022-05-05 09:00:00 02:00 .
2022-05-05 10:00:00 02:00 .
2022-05-05 11:00:00 02:00
...
2022-05-06 20:00:00 02:00
2022-05-06 21:00:00 02:00
(小時 07:00 包括 06:00-07:00 之間的值,依此類推...)
和
Timestamp Energy [Wh]
2022-05-05 .
2022-05-06 .
那么我該如何實作呢?我在想我可以使用scipy.integrate,但我的輸出看起來有點奇怪。
謝謝你。
uj5u.com熱心網友回復:
這是一個非常簡單的解決方案,它使用矩形積分,矩形以 10 秒的間隔從零開始,因此不完全以資料點為中心(假設資料以固定間隔傳遞并且沒有資料丟失),也就是簡單的平均值。
from numpy import random
import pandas as pd
times = pd.date_range('2022-05-05 06:00:04 02:00', '2022-05-06 21:00:00 02:00', freq='10S')
watts = random.rand(len(times)) * 5
df = pd.DataFrame(index=times, data=watts, columns=["Power [W]"])
hourly = df.groupby([df.index.date, df.index.hour]).mean()
hourly.columns = ["Energy [Wh]"]
print(hourly)
hours_in_a_day = 24 # add special casing for leap days here, if required
daily = df.groupby(df.index.date).mean()
daily.columns = ["Energy [Wh]"]
print(daily)
輸出:
Energy [Wh]
2022-05-05 6 2.625499
7 2.365678
8 2.579349
9 2.569170
10 2.543611
11 2.742332
12 2.478145
13 2.444210
14 2.507821
15 2.485770
16 2.414057
17 2.567755
18 2.393725
19 2.609375
20 2.525746
21 2.421578
22 2.520466
23 2.653466
2022-05-06 0 2.559110
1 2.519032
2 2.472282
3 2.436023
4 2.378289
5 2.549572
6 2.558478
7 2.470721
8 2.429454
9 2.390543
10 2.538194
11 2.537564
12 2.492308
13 2.387632
14 2.435582
15 2.581616
16 2.389549
17 2.461523
18 2.576084
19 2.523577
20 2.572270
Energy [Wh]
2022-05-05 60.597007
2022-05-06 59.725029
梯形積分應該給出更好的近似值,但很難正確實施。你必須小心處理小時界限。這基本上只是在整小時(09:59:59.999 和 10:00:00)兩次插入插值的問題。但是,您還必須找出一種方法來推斷范圍的開始和結束,即在您的示例中,從 06:00:05 到 06:00:00。但是請注意,如果您的測量僅從 06:17:23 等中間某個位置開始,該怎么辦?
uj5u.com熱心網友回復:
您可以創建一個新列,表示您的時間戳截斷為小時:
df['Timestamp_hour'] = df['Timestamp'].dt.floor('h')
請注意,在這種情況下,6.00 小時到 6.59 小時之間的行將包含在 6 小時而不是 7 小時中。
然后,您可以在應用集成計算之前按新列對行進行分組:
df_integrated_hour = (
df
.groupby('Timestamp_hour')
.agg({
'Power': YOUR_INTEGRATION_FUNCTION
})
.rename(columns={'Power': 'Energy'})
.reset_index()
)
希望對你有幫助
uj5u.com熱心網友回復:
該解決方案使用了一個名為
# create the bins (datetime index) over which you want to integrate
# using 20s intervals in this example
bins = pd.date_range(
"2022-05-05 06:00:00 02:00", "2022-05-05 06:01:00 02:00", freq="20s"
)
# slice into bins and integrate
result = sf.slice(bins).integral()
result將是一個pandas.Series帶有IntervalIndex和Timedelta值的。IntervalIndex 保留時區資訊,只是不顯示它:
[2022-05-05 06:00:00, 2022-05-05 06:00:20) 0 days 00:00:26
[2022-05-05 06:00:20, 2022-05-05 06:00:40) 0 days 00:00:30.500000
[2022-05-05 06:00:40, 2022-05-05 06:01:00) 0 days 00:00:38
dtype: timedelta64[ns]
您可以將索引更改為“左”值(并查看此時區資訊),如下所示:
result.index = result.index.left
您可以通過適當的除法將值更改為浮點數Timedelta。例如轉換為分鐘:
result/pd.Timedelta("1min")
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474741.html
