用Python排序日期文件

0 投票
3 回答
621 浏览
提问于 2025-04-18 01:39

我有一个文件,里面包含了日期和任务,格式是这样的:

(datetime.datetime(2014, 5, 20, 0, 0), 'laundry')
(datetime.datetime(2014, 6, 1, 0, 0), 'exam ')

我想知道怎么才能把在某个日期之前到期的任务(比如说,一周内到期的任务)以这种格式显示出来呢?

20/05/2014: laundry

谢谢

3 个回答

0

我强烈推荐你使用pandas,这是一个用于数据分析的Python库。通过这个库,你可以从不同的文件格式(比如csv)中读取数据,并使用TimeSeries类来进行各种分析和操作,包括你提到的日期过滤。

举个例子,如果' ts'是你的时间序列对象,想要选择一个时间范围的话:

hour = ts.index.hour
selector = ((10 <= hour) & (hour <= 13)) | ((20 <= hour) & (hour <= 23))
data = ts[selector]
0

假设你的任务保存在一个叫做 mytasks.txt 的文件里,这段代码会列出所有在未来 x 天内的任务。

注意:这段代码使用了 eval,如果你不信任你的输入内容,不要使用这段代码。

from datetime import timedelta
import datetime

# Change 7 to your prefered number of days
limit = datetime.datetime.now() + timedelta(days=7)
with open('mytasks.txt') as ifile:
    for line in ifile:
        day, task = eval(line)
        # This breaks the loop once a day further ahead arises
        if day > limit:
            break
        print '{}: {}'.format(day.strftime('%d/%m/%Y'), task)

假设输入是:

(datetime.datetime(2014, 4, 10, 0, 0), 'chill')
(datetime.datetime(2014, 4, 12, 0, 0), 'out')
(datetime.datetime(2014, 5, 20, 0, 0), 'laundry')
(datetime.datetime(2014, 6, 1, 0, 0), 'exam ')

这将是输出:

10/04/2014: chill
12/04/2014: out
0

假设你的数据是这样的一个元组列表:

date_list = [(datetime.datetime(2014, 5, 20, 0, 0), 'laundry'), (datetime.datetime(2014, 6, 1, 0, 0), 'exam '), (datetime.datetime(2014, 4, 20, 0, 0), 'grocery'), (datetime.datetime(2013, 5, 20, 0, 0), 'tv')]
  • 你可以通过以下方式根据日期获取排序后的列表:

    sorted_dates = sorted(date_list, key=lambda x: str(x[1]), reverse=True)
    

    在这里,你把日期的字符串形式作为关键字传递给 sorted 函数,这样就把日期的排序变成了字符串的排序。这会给你:

    [(datetime.datetime(2013, 5, 20, 0, 0), 'tv'), (datetime.datetime(2014, 5, 20, 0, 0), 'laundry'), (datetime.datetime(2014, 4, 20, 0, 0), 'grocery'), (datetime.datetime(2014, 6, 1, 0, 0), 'exam ')]
    
  • 你可以使用 strftime 方法来格式化你想要的日期格式:

    formatted_dates = [(item[0].strftime("%d/%m/%y"), item[1]) for item in sorted_dates]
    

    这会给你:

    [('20/05/13', 'tv'), ('20/05/14', 'laundry'), ('20/04/14', 'grocery'), ('01/06/14', 'exam ')]
    
  • 最终的输出可以通过循环 formatted_dates 来获得,如下:

    for date, task in formatted_dates:
    print '{}: {}'.format(date, task)
    

    这会打印出

    20/05/13: tv
    20/05/14: laundry
    20/04/14: grocery
    01/06/14: exam
    

如果你的数据已经排好序了,可以直接跳到第二步。

要获取一周内到期的任务,你需要结合使用 timedelta 对象filter 函数。

tasks_in_a_week = filter(lambda x: x[0] > datetime.datetime.now() and x[0] < datetime.datetime.now() + datetime.timedelta(days=7), sorted_dates)

解释一下:datetime.datetime.now() 会给你今天的日期。datetime.datetime.now() + datetime.timedelta(days=7) 会给你从今天起7天后的日期。所以,上面的过滤函数会查找 sorted_dates 列表中,今天之后并且在7天内的任何日期,也就是一周内的日期。

撰写回答