排序日期文件python

时间:2014-04-07 00:00:41

标签: python datetime python-2.7

我有一个包含此表单中的日期和任务的文件

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

如何以这种格式显示特定日期(例如一周内到期)到期的任务?

20/05/2014: laundry

由于

3 个答案:

答案 0 :(得分: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
    

如果您的数据已经排序,则可以跳到第2步。

要在一周内完成任务,您可以使用timedelta objectsfilter函数的组合

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天之后(即一周内)的任何日期。

答案 1 :(得分: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

答案 2 :(得分:0)

我强烈建议您使用pandas,这是一个用于数据分析的python库。使用此库,您可以从不同的文件格式读取为csv,并使用TimeSeries类执行所有类型的分析和操作,包括问题中的日期过滤。

例如,如果'ts'是您的时间序列对象,则选择时间范围:

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