我有一个来自许可证日志文件的数据框。日志文件仅按连续时间记录。在日志文件的标题中是一个开始日期。因此,每当小时以 0 开始时,新的一天就应该开始。我如何在python中解决这个问题?
这是我得到的一个例子。左边是当前结构,右边是预期输出:
我有一个来自许可证日志文件的数据框。日志文件仅按连续时间记录。在日志文件的标题中是一个开始日期。因此,每当小时以 0 开始时,新的一天就应该开始。我如何在python中解决这个问题?
这是我得到的一个例子。左边是当前结构,右边是预期输出:
我通过应用以下函数来做到这一点。
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”是您想要的输出。
我使用了一个与您的输入类似的 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")
我立即想到了一个循环解决方案;不过可能有更多的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']
您没有添加原始数据,因此我创建了一个类似的示例,此解决方案假定没有数据没有日子。
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)