我有一個來自許可證日志檔案的資料框。日志檔案僅按連續小時記錄。在日志檔案的標題中是一個開始日期。因此,每當小時從 0 開始時,新的一天就應該開始。我如何在python中解決這個問題?
這是我得到的一個例子。左邊是當前結構,右邊是預期輸出:

uj5u.com熱心網友回復:
我立即想到了一個回圈解決方案;雖然可能有更多的pythonic方式。
import pandas as pd
from datetime import timedelta
df=pd.read_csv('date_example.csv', parse_dates=['Date'])
for idx, row in df.iloc[1:].iterrows():
if df.loc[idx,'Hour'] == 0:
df.loc[idx,'Date']= df.loc[idx-1,'Date'] timedelta(days=1)
else:
df.loc[idx,'Date'] = df.loc[idx-1, 'Date']
uj5u.com熱心網友回復:
你沒有添加原始資料,所以我創建了一個類似的例子,這個解決方案假設沒有資料的日子。
import pandas as pd
import datetime
import numpy as np
# example data
data = [[datetime.datetime(2021,10,28), 0,5], [np.nan, 1, 6], [np.nan, 23, 7], [np.nan, 1, 8]]
df = pd.DataFrame(data, columns = [['Date', 'Hour','License_Count']])
for i in range(1, len(df)):
if df.iat[i,1] >= df.iat[i-1,1]:
df.loc[i,'Date'] = df.iat[i-1,0]
if df.iat[i,1] <= df.iat[i-1,1]:
df.loc[i,'Date'] = df.iat[i-1,0] datetime.timedelta(days=1)
uj5u.com熱心網友回復:
我通過應用下面的函式來做到這一點。
import pandas as pd
from datetime import timedelta
df["Date"] = pd.to_datetime(df["Date"])
temp=df.copy()
def func(x):
if x['Hours'] == 0:
if x.name == 0:
temp.loc[x.name, 'Date'] = temp.loc[0, 'Date'] timedelta(days=1)
else:
temp.loc[x.name, 'Date'] = temp.loc[x.name - 1, 'Date'] timedelta(days=1)
else:
temp.loc[x.name, 'Date'] = temp.loc[x.name - 1, 'Date']
df.apply(func, axis = 1)
print(temp)
“temp”是您想要的輸出。
uj5u.com熱心網友回復:
我使用 Excelsheet 作為 input.xlsx,它與您的輸入相似。日期自動從小時 0 開始,因此我沒有使用帶有小時的列。然后將輸出存盤在 output.xlsx 中。
import pandas as pd
from datetime import timedelta
df = pd.read_excel("input.xlsx")
date = df['Date'][0]
for index, row in df.iterrows():
df['Date'][index] = date
date = timedelta(hours=1)
df.to_excel("output.xlsx")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345905.html
上一篇:R:按日期將行插入資料框中
