簡體   English   中英

時間 Dataframe 結束開始列到 10 分鍾范圍 Dataframe

[英]Time Dataframe with end start columns to 10min range Dataframe

我有一個 dataframe,其中描述的開始和結束時間在列中。 描述在另一列中。

我正在嘗試將數據集轉換為 10 分鍾范圍 dataframe。在 output dataframe 中,選擇了開始日期和結束日期。 如果沒有數據應該是nan

例如:

start_date = 15/09/2020 14:00:00
end_date = 16/09/2020 23:00:00

數據 DataFrame

     start_time              end_time           info

15/09/2020 14:35:54       15/09/2020 15:05:48     A                
15/09/2020 15:54:05       16/09/2020 02:15:22     B 
16/09/2020 21:17:10       16/09/2020 22:15:04     A 
...

測試 DataFrame

      timestamp          info

15/09/2020 14:00:00       nan   
15/09/2020 14:10:00       nan
15/09/2020 14:20:00       nan
15/09/2020 14:30:00       A
15/09/2020 14:40:00       A
15/09/2020 14:50:00       A
15/09/2020 15:00:00       A
15/09/2020 15:10:00       A
15/09/2020 15:20:00       nan
15/09/2020 15:30:00       nan
15/09/2020 15:40:00       nan
15/09/2020 15:50:00       B
15/09/2020 16:00:00       B
15/09/2020 16:10:00       B
15/09/2020 16:20:00       B
...

到目前為止我已經完成了:

data['timestampStart'] = pd.to_datetime(data['timestampStart'])
data['timestampEnd'] = pd.to_datetime(data['timestampEnd'])

range_time = pd.date_range(start=start_date, end=end_date, freq='10min')
test= pd.DataFrame()
test['timestamp'] = pd.to_datetime(range_time)

for index, row in data.iterrows():
    if test['timestamp'] > data['timestampStart'] & test['timestamp'] < data['timestampEnd']:
        test['description'] = data['description']
    else:
        test['description'] == np.nan

我在 if 語句中收到錯誤:&: 'Timestamp' 和 'Timestamp' 不支持的操作數類型

但我陷入了如何解決它的困境。 歡迎任何建議。

謝謝

你可以試試這個:

def check_date(s,d):
    if len(d[(d.timestampStart<s)&(d.timestampEnd>s)]) > 0:
        return d[(d.timestampStart<s)&(d.timestampEnd>s)].iloc[0]['info']
    else:
        return None

test['description'] = test.timestamp.apply(lambda x: check_date(x, data))

這將使用測試 dataframe 的每一行來確定是否在數據 dataframe 上找到任何匹配值。它不是很優雅,但它似乎可以工作。

更新:方法 2

您可以更改主數據框以實現您要查找的內容

data['start_base'] = data.start_time.apply(lambda x: x.replace(minute=int(x.minute/10)*10, second=0))

data['timestamp'] = data.apply(lambda x: pd.date_range(start=x.start_base, end=x.end_time,freq='10min'), axis=1)

new_data = data[['timestamp','info']].explode('length')

我們實質上是寫下每個“開始”/“結束”對之間的 10 分鍾間隔,然后通過 df.explode() 將其放在一個列中。 然后您可以將其合並到“測試”數據框,以根據需要獲取所有時隙。

test = test.merge(new_data, on='timestamp', how='left')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM