0

我有一个来自许可证日志文件的数据框。日志文件仅按连续时间记录。在日志文件的标题中是一个开始日期。因此,每当小时以 0 开始时,新的一天就应该开始。我如何在python中解决这个问题?

这是我得到的一个例子。左边是当前结构,右边是预期输出:

在此处输入图像描述 在此处输入图像描述

4

4 回答 4

0

我通过应用以下函数来做到这一点。

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”是您想要的输出。

于 2021-10-29T11:50:52.067 回答
0

我使用了一个与您的输入类似的 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")
于 2021-10-29T12:55:03.197 回答
0

我立即想到了一个循环解决方案;不过可能有更多的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']
于 2021-10-29T10:27:38.810 回答
0

您没有添加原始数据,因此我创建了一个类似的示例,此解决方案假定没有数据没有日子。

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)
于 2021-10-29T10:42:52.513 回答