【问题标题】:Timeline of file modification (grouped by day)文件修改时间线(按天分组)
【发布时间】:2020-12-18 16:10:20
【问题描述】:

下面的代码是扫描文件夹中的所有markdown文件,并在2个单独的列表中收集文件名和修改日期。之后,我将两个列表合并为 Panada 对象。我的想法是在 Pandas 中我可以根据天对数据进行分组,但不幸的是我被困在了这个地方。我不知道如何处理熊猫对象来存档:

这是下面的脚本生成的:

               modification date        file
datetime    
2020-07-26 13:33:37 2020-07-26 13:33:37 File1
2020-07-26 10:15:50 2020-08-03 10:15:50 File2
2020-07-25 22:30:01 2020-08-20 22:30:01 File3
2020-07-25 10:01:02 2020-07-30 10:01:02 File4
2020-07-25 10:34:53 2020-08-19 10:34:53 File5

这就是我想要得到的

(同一天的文件在相同的“标题”下,并为每一行插入带有时间的文件列表。所有(日期和时间)从晚到最后排序。

## 26.7 (Sunday)

13:33 | File1
10:15 | File2

## 25.7 (Saturday)

22:30 | File3
10:34 | File5
10:01 | File4

当前代码(直到熊猫对象)

import pandas as pd
from datetime import datetime as dt
from pathlib import Path 
from dateutil import parser

File_vault = "any folder path"
File_ext = "*.md"

List_names = []
List_dates = []

# RECURSIVE UNSORTED LOOP OF MARKDOWN FILES
for file in Path(File_vault).rglob(File_ext):
    
    file_stamp = os.path.getctime(file)
    
    # FILL LISTS WITH DATA
    List_names.append((file.name).replace(File_ext,""))
    List_dates.append(parser.parse(time.ctime(file_stamp)))

# CONVERT TO PANDA OBJECT
df = pd.DataFrame()
df['datetime'] = List_dates
df.index = df['datetime'] 
df['file'] = List_names
df.head()

谁能帮忙?

【问题讨论】:

    标签: python pandas markdown pandas-groupby


    【解决方案1】:

    您需要在代码中进行以下更改。 我没有创建两个在这里完成分组的列表,而是创建了一个包含三列日期、时间和文件名的嵌套列表。

    #Date data
    ddate = parser.parse(time.ctime(file_stamp))
    #Nested list of date,time and filename
    List_names.append([ddate.date(),ddate.time(),(file.name).replace(File_ext,"")])
    

    使用列表创建pandas Dataframe,提供列名并使用pandas groupby 方法获取输出。

    #DF Creation
    df = pd.DataFrame(List_names)
    df.columns = ['date','time', 'file']
    df_grouped = df.groupby('date')
    #looping over the grouped data and printing output
    for group, gdf in df_grouped:
        print('Day:', group, '\n')
        print( gdf.iloc[:, 1:], '\n')
    

    您可以在下面找到整个代码和输出快照。

    注意:根据需要更改 File_vault,File_ext 变量

    import pandas as pd
    from datetime import datetime as dt
    from pathlib import Path 
    from dateutil import parser
    import os
    import time
    
    
    File_vault = ""
    File_ext = ""
    
    List_names = []
    
    # RECURSIVE UNSORTED LOOP OF MARKDOWN FILES
    for file in Path(File_vault).rglob(File_ext):
        
        file_stamp = os.path.getctime(file)
        ddate = parser.parse(time.ctime(file_stamp))
        # FILL LISTS WITH DATA
        List_names.append([ddate.date(),ddate.time(),(file.name).replace(File_ext,"")])
    
    # CONVERT TO PANDA OBJECT
    
    df = pd.DataFrame(List_names)
    df.columns = ['date','time', 'file']
    df_grouped = df.groupby('date')
    for group, gdf in df_grouped:
        print('Day:', group, '\n')
        print( gdf.iloc[:, 1:], '\n')
    
    

    输出

    Day: 2020-07-31 
    
           time          file
    1  15:34:54  sample_1.png
    2  15:34:56  sample_2.png
    3  15:34:58  sample_3.png
    4  15:35:00  sample_4.png 
    
    Day: 2020-08-30 
    
           time          file
    0  14:22:52    New folder
    5  14:22:58  sample_1.png 
    

    如果需要,您可以更改列名!

    【讨论】:

    • 那是接近光速的答案!是的,在我尝试将所有内容放在一个列表中之前,但 Pandas 出于某种原因抱怨,然后我切换到 2 列。你的回答是我需要的 99%。我尝试通过添加df.sort_index 以相反的顺序(从最新到最旧)对字段进行排序,但由于某种原因,Pandas 仍然像以前一样产生相同的顺序。
    • 在我的文件夹中尝试您的代码时,按时间排序是完全随机的,按天排序是相反的。我尝试了各种排序方法,但一如既往我在 Pandas 中失败了......如果你有任何指示我如何做到这一点,我将不胜感激!
    【解决方案2】:

    通过添加解决了所需的排序:

    df.sort_values(by=['date','time'], inplace=True, ascending=False)
    df_grouped = df.groupby('date', sort=False)
    

    功能代码:

    import pandas as pd
    from datetime import datetime as dt
    from pathlib import Path 
    from dateutil import parser
    import os
    import time
    
    File_vault = "" #folder path
    File_ext = ""   #file extension
    List_names = []
    
    # RECURSIVE UNSORTED LOOP OF MARKDOWN FILES
    for file in Path(File_vault).rglob(File_ext):
        
        file_stamp = os.path.getctime(file)
        ddate = parser.parse(time.ctime(file_stamp))
        # FILL LISTS WITH DATA
        List_names.append([ddate.date(),ddate.time(),(file.name).replace(File_ext,"")])
    
    # CONVERT TO PANDA OBJECT
    df = pd.DataFrame(List_names)
    df.columns = ['date','time', 'file']
    
    # DATE SORTING
    df.sort_values(by=['date','time'], inplace=True, ascending=False)
    df_grouped = df.groupby('date', sort=False)
    
    for group, gdf in df_grouped:
        print('Day:', group, '\n')
        print( gdf.iloc[:, 1:], '\n')
    

    非常感谢@Rikigami!

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      相关资源
      最近更新 更多