用Python排序日期文件
我有一个文件,里面包含了日期和任务,格式是这样的:
(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天内的任何日期,也就是一周内的日期。