只知道开始日期和连续时间就填日期? Pandas

Fill in Date when only knowing startdate and continous hours? Pandas

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

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

我立刻想到了循环解决方案;不过可能还有更多 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)

我已经通过应用以下函数完成了此操作。

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

我使用了与您的输入类似的 Excel 表格 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")