【问题标题】:Missing date values in date.sum()date.sum() 中缺少日期值
【发布时间】:2021-09-10 08:11:42
【问题描述】:

这是我的第一个问题,如果我做错了什么,请多多包涵:) 我正在处理 2018、2019、2020 和 2021 年的数据集。 (数据集每天都有一个文件,我已经手动检查了文件) 我试图通过 Groupby 和 datetime 将一些值与 pandas 相加。 最终目标是获得整个数据集每天的总和值。 出于某种原因,2020 年每个月都跳过第四个,我不知道为什么。 我已经搜索了 stackoverflow、datacamp 和其他几个小时,但没有解决方案。 现在我得试着问问你们。

我的代码首先列出了我文件夹中所有文件名的列表。 之后我替换“。”使用“:”,所以我可以将日期转换为 datetime64[ns] (文件中有不同的日期格式) 该代码将日期附加到列表中并将它们设置在列中。 通过 concat 在单个数据框中返回文件。 在此之后,我正在创建一个新列,在其中查找另一列中的一些单词。这个新列用于对数据框进行排序。我为此使用 .loc。 然后我 groupby.dt.date 和 .sum 那么如果一个日期的值为零,我需要它显示所以我使用 .asfreq("D") 和 .fillna(0)

一切都很好,但每隔 4 天(2020 年 4 月 1 日、2020 年 4 月 2 日、2020 年 4 月 3 日、2020 年 4 月 4 日、2020 年 4 月 5 日等)丢失。 但是为什么! :) (文件在那里。如果我自己拿所有文件,那一切都很好。值在那里。)

def FileList(): #Creates a list with all the files
    CSVFileList = []
    FilePath = 'Data/'
    FileDirectoryList = os.listdir(FilePath)
    for i in FileDirectoryList:
        if(i[-3:] == "CSV"):
            CSVFileList.append(i)
    return CSVFileList
def Concat(filelist): #Concat all the files in the list from FileList
    columns_names = ["Order_ID", "Dato", "Varenummer", "Varenavn", "Quantity", "Pris", "Pris_Sum", "Tilbehør", "col1", "col2"]
    dflist = []
    for i in filelist:
        df = pd.read_csv("Data/"+i, delimiter = ";", names = columns_names)
        DatoList = []
        for i in df["Dato"]:
            u = i.replace(".",":")
            DatoList.append(u)
        df["Dato"] = DatoList
        df['Dato'] = pd.to_datetime(df['Dato']) #Convert date's to Datetime64[ns]
        dflist.append(df)
    dataframe = pd.concat(dflist)
    return dataframe
def BestillingDF(filename):    
    
    df = filename
    #New Vare_Beskrivelse
    Vare_navn = []
    Varenavn = df["Varenavn"]
    for i in Varenavn:
        i = str(i)
        i = i.lower()
        if "spareribs" in i:
            Vare_navn.append("Spareribs")
        elif "salat" in i:
            Vare_navn.append("Salat")
        elif "pommes" in i:
            Vare_navn.append("Pommes Frites")
        else:
            Vare_navn.append("")
            
    df["Vare_Navn"] = Vare_navn
    Spareribs_Vægt_List = []
    spareribsvægt = bi.Spareribs_Vægt() #Gets a value from a dict in another file
    for i in df["Varenavn"]:
        if i not in spareribsvægt:
            Spareribs_Vægt_List.append(0)
        else:
            Spareribs_Vægt_List.append(spareribsvægt[i])
    df["Spareribs_Vægt_Kuvert"] = Spareribs_Vægt_List
    df["Spareribs_Vægt_[Q*K]"] = df["Quantity"] * df["Spareribs_Vægt_Kuvert"]
    return df
def Spareribs_A_Day(filename):
    data = BestillingDF(filename)
    spare = data.loc[data["Vare_Navn"] == "Spareribs"] #Sorts the dataframe 

    s = spare.groupby([spare['Dato'].dt.date])['Spareribs_Vægt_Kuvert'].sum() #Groups the series by date/day and sums the value

    t = s.asfreq('D') #Shows the zero values (NaN)

    df = pd.DataFrame(t)
    df['Spareribs_Vægt_Kuvert'] = df['Spareribs_Vægt_Kuvert'].fillna(0) #Fills the NAN by zero
    return df
def main():
        
    filelist = FileList()
    concat_DF = Concat(filelist)
    ribs = Spareribs_A_Day(concat_DF)
    print(ribs.head())

main()

我不是 python 或编码方面的冠军。但我希望你们无论如何都能帮助我:) the code result

【问题讨论】:

  • 包含示例数据作为文本和预期输出:stackoverflow.com/questions/20109391/…
  • 我们需要查看没有出现在输出中的日期列值的示例,否则我们只是在猜测出了什么问题。

标签: python pandas datetime group-by


【解决方案1】:

感谢 David Erickson 和 John D. 下次我发布问题时,我会记得发布数据样本。 (这个数据样本的问题是它非常大。当数据样本“完美”时,问题不会出现)

但是,但是,但是,我找到了答案……在某种程度上……:)

我的 .csv 文件在文件内有一个日期。我正在使用的那个。日期格式随着时间而改变,我试图解决这个问题。 我将日期更改为相同的格式,看起来一切都很好。 但是每次 .day 变成与 .month 相同的数字(4/4/2020 或 7/7/2020、9/9/2020 等),格式都会改变(%Y-%m-%d & %Y-%d-%m) 然后当我使用

spare.groupby([spare['CleanD'].dt.date])['SpareVægtSum'].sum()

总和是有线的。 这不是洞的问题,而是我发现的一种模式。 我的解决方案是从文件名和 -1 天获取日期,例如:

def CleanD():
    file = FileList()
    df_list = []
    for i in file:
        columns_names = ["Order_ID", "Dato", "Varenummer", "Varenavn", "Quantity", "Pris", "Pris_Sum", "Tilbehør", "col1", "col2"]
        df = pd.read_csv("Data/"+i, delimiter = ";", names = columns_names)
        cleanD_list = []
        for u in df["Dato"]:
            cleanD_list.append(i[0:10])
        df["CleanD"] = cleanD_list
        df_list.append(df)
    df = pd.concat(df_list)
    
    df['CleanD']= pd.to_datetime(df['CleanD'], format='%Y-%m-%d')
    
    cleanD_list = []
    for i in df["CleanD"]:
        u = i + pd.Timedelta(days=-1)
        cleanD_list.append(u)
    df['CleanD'] =  cleanD_list
    return df

现在一切都很好:) 不知道为什么 .datetime 会这样,也许有人知道什么/为什么? 但它是固定的,而且我已经用了这么多时间,我对这次找到的解决方案很满意 :=)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多