Python初學者在這里。
我找不到與此類似的任何內容,但我覺得它不應該那么難。
我有一個很大的 Excel 表格,其中包含來自不同傳感器的值,但由于測量錯誤,某些值丟失了。因此,當我將所有內容放入 Pandas 資料框時,我會得到如下內容:
| 時間戳 1 | 傳感器1 | 時間戳2 | 傳感器2 |
|---|---|---|---|
| 08:00 | 100 | 08:00 | 60 |
| 08:05 | 102 | 08:10 | 40 |
| 08:10 | 105 | 08:15 | 50 |
| 08:15 | 101 | 08:25 | 31 |
| 08:20 | 103 | 鈉鹽 | NaN |
| 08:25 | 104 | 鈉鹽 | NaN |
真實的資料幀有 7 個傳感器和超過 10 萬行,因此不同列中有不同數量的 NaT 和 NaN。
我需要對齊每個傳感器的時間戳以避免一些不一致。因此,我想將 TimeStamp2 和 Sensor2 中的行從與 TimeStamp1 不同的點移動,在 Sensor2 中的位置添加缺失的時間和 NaN(或空)值,并使末尾的 NaT 和 NaN 從兩者中消失列。
像這樣的輸出:
| 時間戳 1 | 傳感器1 | 時間戳2 | 傳感器2 |
|---|---|---|---|
| 08:00 | 100 | 08:00 | 60 |
| 08:05 | 102 | 08:05 | 空 (NaN) |
| 08:10 | 105 | 08:10 | 40 |
| 08:15 | 101 | 08:15 | 50 |
| 08:20 | 103 | 08:20 | 空 (NaN) |
| 08:25 | 104 | 08:25 | 31 |
我想我可以通過詢問一種在特定列的特定行中插入特定元素的方法來簡化問題。我見過的所有移位示例都會向上或向下移動整個列。是否有捷徑可尋?
如果更容易,這個解決方案也適用于我:
| 時間戳 | 傳感器1 | 傳感器2 |
|---|---|---|
| 08:00 | 100 | 60 |
| 08:05 | 102 | 空 (NaN) |
| 08:10 | 105 | 40 |
| 08:15 | 101 | 50 |
| 08:20 | 103 | 空 (NaN) |
| 08:25 | 104 | 31 |
uj5u.com熱心網友回復:
如果您的資料完全按照您的示例進行設定,這將起作用,否則您將不得不適應您的資料。
# change timestamps columns to datetime. You don't say if there's a date component, so you may have to get your timestamps in order before moving on.
timestamps = df.filter(regex='TimeStamp').columns.tolist()
for t in timestamps:
df[t] = pd.to_datetime(df[t])
# get the max and min of all datetimes in the timestamp columns
end = df.filter(regex='TimeStamp').max().max()
start = df.filter(regex='TimeStamp').min().min()
# create a new date range
new_dates = pd.date_range(start=start, end=end, freq='5Min')
# get columns for iterations - should only be even and contain timestamp and sensor columns as your example shows
num_columns = df.shape[1]
# iterate and concat
dflist = []
for i in range(0, num_columns, 2):
print(i)
d = df.iloc[:, i:i 2].set_index(df.iloc[:, i].name).dropna().reindex(new_dates)
dflist.append(d)
pd.concat(dflist, axis=1)
Sensor1 Sensor2
2021-10-18 08:00:00 100 60.0
2021-10-18 08:05:00 102 NaN
2021-10-18 08:10:00 105 40.0
2021-10-18 08:15:00 101 50.0
2021-10-18 08:20:00 103 NaN
2021-10-18 08:25:00 104 31.0
uj5u.com熱心網友回復:
@ti7 的建議是正確的;將資料幀拆分為單獨的幀,合并和填充:
sensor1 = df.filter(like='1')
sensor2 = df.filter(like='2')
(sensor1.merge(sensor2,
how = 'outer',
left_on='TimeStamp1',
right_on = 'TimeStamp2',
sort = True)
.fillna({"TimeStamp2" : df.TimeStamp1})
.dropna(subset=['TimeStamp1'])
)
TimeStamp1 Sensor1 TimeStamp2 Sensor2
0 08:00 100.0 08:00 60.0
1 08:05 102.0 08:05 NaN
2 08:10 105.0 08:10 40.0
3 08:15 101.0 08:15 50.0
4 08:20 103.0 08:20 NaN
5 08:25 104.0 08:25 31.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325903.html
