【问题标题】:Python calendar with pandas (basic level)带有熊猫的 Python 日历(基础级别)
【发布时间】:2021-03-04 17:05:58
【问题描述】:

您好,我正在尝试制定一年的时间表,我想编写一个包含每天活动信息的文本文件。代码是错误的,但我需要帮助来更改它,以便我确实希望它这样做。

import pandas as pd
a = ['football', 'read']  # between 01-12-2020 - 30-04-2021
b = ['read', 'sleep']  # between 01-05-2021 - 31-08-2021
c = ['read', 'eat']  # between 01-09-2021 - 30-11-2021


with open("food.txt", "w") as f:
    for i in a:
        f.write(f"\n")
        s = pd.date_range(start='2020-12-1', end='2021-11-30')
        if '2020-12-1'<=s<='2021-04-30':
            f.write(f'{i},{s}')

#I'm trying to make a textfile that match up the activities with all dates.
# For example I want the text file to write:
# 2020-12-1
# football
# read 

# 2020-12-2
# football
# read 

# ...

# 2021-04-30
# read 
# sleep
#etc...
#If there are better ways of making this I would appreciate it, but the activities must be from a 
# inside list

【问题讨论】:

    标签: python python-3.x pandas list file-writing


    【解决方案1】:

    我不确定这是否是你想要的。

    但您可以为 if 语句设置日期和结束日期。

    然后 iteratre 抛出了整个日期列表。

    我认为稍微修改一下这可能对你有用。

    import pandas as pd
    a = ['football', 'read']  # between 01-12-2020 - 30-04-2021
    start_a = pd.to_datetime('01-12-2020')
    end_a = pd.to_datetime('30-04-2021')
    b = ['read', 'sleep']  # between 01-05-2021 - 31-08-2021
    start_b = pd.to_datetime('01-05-2021')
    end_b = pd.to_datetime('31-08-2021')
    c = ['read', 'eat']  # between 01-09-2021 - 30-11-2021
    start_c = pd.to_datetime('01-09-2021')
    end_c = pd.to_datetime('30-11-2021')
    
    
    with open("food.txt", "w") as f:
        f.write(f"\n")
        s = pd.date_range(start='2020-12-1', end='2021-11-30')
    
        for date in s:
            f.write(str(date) + "\n")
            if end_a >= date >= start_a:
                for element in a:
                    f.write(element + "\n")
    
            if end_b >= date >= start_b:
                for element in b:
                    f.write(element + "\n")
    
            if end_c >= date >= start_c:
                for element in c:
                    f.write(element + "\n")
    
            f.write("\n\n")
    
    

    关于您关于重复的问题: 您可以首先将所有元素写入 tmp 列表并检查重复项。 然后只对文件写入一次。

    所以也许把 for 循环改成这样:

            for date in s:
                tmp = []
                f.write(str(date) + "\n")
                if end_a >= date >= start_a:
                    for element in a:
                        if element not in tmp:
                            tmp.append(element)
    
                if end_b >= date >= start_b:
                    for element in b:
                        if element not in tmp:
                            tmp.append(element)
    
                if end_c >= date >= start_c:
                    for element in c:
                        if element not in tmp:
                            tmp.append(element)
    
                for element in tmp:
                    f.write(element + "\n")
    
                f.write("\n\n")
    

    所以这可能是最终版本。

    2021-04-30 是足球比赛的最后一天。

    2021-08-31 是睡眠的最后一天,2021-01-05 是第一天。

    import pandas as pd
    a = ['football', 'read']  # between 01-12-2020 - 30-04-2021
    start_a = pd.to_datetime('01-12-2020').to_pydatetime()
    end_a = pd.to_datetime('30-04-2021').to_pydatetime()
    b = ['read', 'sleep']  # between 01-05-2021 - 31-08-2021
    start_b = pd.to_datetime('01-05-2021').to_pydatetime()
    end_b = pd.to_datetime('31-08-2021').to_pydatetime()
    c = ['read', 'eat']  # between 01-09-2021 - 30-11-2021
    start_c = pd.to_datetime('01-09-2021').to_pydatetime()
    end_c = pd.to_datetime('30-11-2021').to_pydatetime()
    
    
    with open("food.txt", "w") as f:
        f.write(f"\n")
        s = pd.date_range(start='2020-12-1', end='2021-11-30').to_pydatetime()
    
        for date in s:
            tmp = []
            f.write(str(date) + "\n")
            if date >= start_a and date <= end_a:
                for element in a:
                    if element not in tmp:
                        tmp.append(element)
    
            if date >= start_b and date <= end_b:
                for element in b:
                    if element not in tmp:
                        tmp.append(element)
    
            if date >= start_c and date <= end_c:
                for element in c:
                    if element not in tmp:
                        tmp.append(element)
    
            for element in tmp:
                f.write(element + "\n")
    
            f.write("\n\n")
    
    

    不同的输出文件:

    import pandas as pd
    import datetime
    import calendar
    # (month,day,year)
    a = ['football', 'read']  # between 01-12-2020 - 30-04-2021
    start_a = pd.to_datetime('12-01-2020').to_pydatetime()
    end_a = pd.to_datetime('04-30-2021').to_pydatetime()
    b = ['read', 'sleep']  # between 01-05-2021 - 31-08-2021
    start_b = pd.to_datetime('05-01-2021').to_pydatetime()
    end_b = pd.to_datetime('08-31-2021').to_pydatetime()
    c = ['read', 'eat']  # between 01-09-2021 - 30-11-2021
    start_c = pd.to_datetime('09-01-2021').to_pydatetime()
    end_c = pd.to_datetime('11-30-2021').to_pydatetime()
    
    s = pd.date_range(start='2020-12-1', end='2021-11-30').to_pydatetime()
    
    
    def findDay(date):
        born = datetime.datetime.strptime(date, '%Y %m %d').weekday()
        return (calendar.day_name[born])
    
    
    for date in s:
        file_name = str(date).replace(" 00:00:00", "") + ".txt"
        with open(file_name, "w") as f:
            f.write(str(date).replace(" 00:00:00", "") + " " +
                    findDay(str(date).replace(" 00:00:00", "").replace("-", " ")) + "\n")
            tmp = []
            if date >= start_a and date <= end_a:
                for element in a:
                    if element not in tmp:
                        tmp.append(element)
    
            if date >= start_b and date <= end_b:
                for element in b:
                    if element not in tmp:
                        tmp.append(element)
    
            if date >= start_c and date <= end_c:
                for element in c:
                    if element not in tmp:
                        tmp.append(element)
    
            for element in tmp:
                f.write(element + "\n")
    
    

    【讨论】:

    • 但在 2021-01-05 的文本文件中我看到:足球读读睡眠
    • 你知道我怎么能改变这样 read 不会出现两次吗? @西蒙
    • 我对重复项进行了编辑。 @Carl-ErikPettersson
    • 再次感谢您!编辑提供了更好的输出,但是在 2021-01-05 及以后,我得到了 3 个输出。 @Simon 是否缺少任何小细节?我得到:足球阅读睡眠
    • 首先我在我的答案中发现了一个错误,我将它从代码中删除(第一个)。比较结束日期​​有些不对劲。我试着弄清楚。 @Carl-ErikPettersson
    猜你喜欢
    • 2020-07-19
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2018-01-09
    • 2017-10-09
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多