隨著時間的推移,我對行程狀態進行了一些稀疏測量,如下所示:
tag
2022-01-15
2022-01-08 #Step3
2022-01-06 #Step2
2021-12-31
2021-12-28 #Step1
...我想把它們變成一個完整的系列,我可以用它來繪制一個時間線,看??起來像這樣:
tag
2021-12-28 #Step1
2021-12-29 #Step1
2021-12-30 #Step1
2021-12-31 #Step1
2022-01-01 #Step1
2022-01-02 #Step1
2022-01-03 #Step1
2022-01-04 #Step1
2022-01-05 #Step1
2022-01-06 #Step2
2022-01-07 #Step2
2022-01-08 #Step3
2022-01-09 #Step3
2022-01-10 #Step3
2022-01-11 #Step3
2022-01-12 #Step3
2022-01-13 #Step3
2022-01-14 #Step3
2022-01-15 #Step3
下面的代碼有效,但它看起來很丑??,我想知道是否有更優雅/更有效的方法來實作這一點。另外,我得到了一個SettingWithCopyWarning我應該能夠修復的問題。
謝謝!!
#! /usr/bin/env python3
import pandas as pd
MY_SAMPLINGS = [
{'timestamp': '2022-01-15', 'tag': ''},
{'timestamp': '2022-01-08', 'tag': '#Step3'},
{'timestamp': '2022-01-06', 'tag': '#Step2'},
{'timestamp': '2021-12-31', 'tag': ''},
{'timestamp': '2021-12-28', 'tag': '#Step1'}
]
myDates = [d['timestamp'] for d in MY_SAMPLINGS]
dates = pd.date_range(myDates[-1],myDates[0])
df = pd.DataFrame(index=dates, columns=['tag'])
for x in range((len(MY_SAMPLINGS)-1),0,-1):
startTime = MY_SAMPLINGS[x]['timestamp']
endTime = MY_SAMPLINGS [x-1]['timestamp']
if (MY_SAMPLINGS[x]['tag']):
myTag = MY_SAMPLINGS[x]['tag']
else:
myTag = MY_SAMPLINGS[x 1]['tag']
df.loc[startTime:endTime]['tag'] = myTag
print (df)
uj5u.com熱心網友回復:
好的,我將分小步分解所有內容,但這只是幾行代碼,并且比回圈更具可擴展性。
import pandas as pd
df = pd.DataFrame(MY_SAMPLINGS)
我們首先希望將時間戳作為有序時間索引。
df["timestamp"] = pd.to_datetime(df["timestamp"], format="%Y-%m-%d")
df = df.set_index("timestamp").sort_index()
這使 :
tag
timestamp
2021-12-28 #Step1
2021-12-31
2022-01-06 #Step2
2022-01-08 #Step3
2022-01-15
然后,每天重新采樣并向前填充,這意味著重新采樣生成的任何缺失值都將采用之前非缺失值的值。
df = df.resample("1D").ffill()
這使:
tag
timestamp
2021-12-28 #Step1
2021-12-29 #Step1
2021-12-30 #Step1
2021-12-31
2022-01-01
2022-01-02
2022-01-03
2022-01-04
2022-01-05
2022-01-06 #Step2
2022-01-07 #Step2
2022-01-08 #Step3
2022-01-09 #Step3
2022-01-10 #Step3
2022-01-11 #Step3
2022-01-12 #Step3
2022-01-13 #Step3
2022-01-14 #Step3
2022-01-15
現在,我們仍然有所有這些空字串,讓我們將它們視為空字串并再次向前填充。
df = df.replace('', pd.NA).ffill()
現在我們完成了:
tag
timestamp
2021-12-28 #Step1
2021-12-29 #Step1
2021-12-30 #Step1
2021-12-31 #Step1
2022-01-01 #Step1
2022-01-02 #Step1
2022-01-03 #Step1
2022-01-04 #Step1
2022-01-05 #Step1
2022-01-06 #Step2
2022-01-07 #Step2
2022-01-08 #Step3
2022-01-09 #Step3
2022-01-10 #Step3
2022-01-11 #Step3
2022-01-12 #Step3
2022-01-13 #Step3
2022-01-14 #Step3
2022-01-15 #Step3
uj5u.com熱心網友回復:
您可以嘗試在此處使用重采樣。請注意,我已經用 Nones 替換了一個空字串,以便以后可以將 fillna 與 ffill 方法一起使用。
MY_SAMPLINGS = [
{'timestamp': '2022-01-15', 'tag': None},
{'timestamp': '2022-01-08', 'tag': '#Step3'},
{'timestamp': '2022-01-06', 'tag': '#Step2'},
{'timestamp': '2021-12-31', 'tag': None},
{'timestamp': '2021-12-28', 'tag': '#Step1'}
]
df = pd.DataFrame(MY_SAMPLINGS).assign(timestamp=lambda x: pd.to_datetime(x["timestamp"])).set_index("timestamp")
result = df.resample('1D').pad().fillna(method="ffill")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404896.html
標籤:
上一篇:嵌套狀態的反應性能
