Python处理日期和时间

时间:2010-03-31 19:32:09

标签: python datetime

我正在寻找以下解决方案:

鉴于今天的日期,弄清楚之前的几个月。所以2应该今天回归,因为它目前是3月,也就是今年的第3个月。 12月应该返回。

然后基于此,我需要能够遍历目录并查找当月创建的所有文件。

奖励积分包括查找上个月创建的最新文件。

5 个答案:

答案 0 :(得分:3)

最简单,其中adatedatetime.date的实例:

def previousmonth(adate):
    m = adate.month - 1
    return m if m else 12

在大多数Unix文件系统中没有真正的方法来确定何时创建文件,因为他们只是不保留这些信息。也许你想要“最新的inode更改时间”(可能是创建,也可能是其他一些inode更改):

import os, datetime
def cmonth(filename):
    ts = os.stat(filename).st_ctime
    return datetime.date.fromtimestamp(ts).month

当然,这可能意味着任何年的那个月 - 你确定,在这两个问题中,你不想要以及月份?那将是.year属性。

无论如何,根据你的问题,仅针对单个目录(这是你的问题的字母)坚持使用月份来获取你可以使用的所有文件os.listdir(对于一个植根于你的目录中的树)请改用os.walk。然后只保留在给定月份内具有最新inode-change的那些:

def fileswithcmonth(dirname, whatmonth):
    results = []
    for f in os.listdir(dirname):
        fullname = os.path.join(dirname, f)
        if whatmonth == cmonth(fullname):
            results.append(fullname)
    return results

你可以把它编码为列表理解,但是那里的代码太多了,使listcomp变得优雅和简洁。

要获得“最新”时间,您可以重复os.stat调用(更慢但可能更简单),或者更改cmonth以返回时间戳。采取简单的路线:

def filetimestamp(fullname):
    return os.stat(fullname).st_ctime

现在,给出列表files文件全名(即包含路径)的“最新文件”是

max(files, key=filetimestamp)

当然,根据您的具体规格,您可以将这些全部放在一起有很多自由度 - 假设规格看起来不一定精确或完整我已选择显示构建块你可以很容易地调整和整合你的确切需求,而不是一个完整的解决方案,可能会解决与你的实际问题有些不同的问题; - )。

修改:由于OP澄清了他们需要年份和月份,让我们看看需要进行哪些更改,使用元组ym代替(year, month)代替裸机月:

def previousym(adate):
    y = adate.year
    m = adate.month - 1
    return (y, m) if m else (y - 1, 12)

import os, datetime
def cym(filename):
    ts = os.stat(filename).st_ctime
    dt datetime.date.fromtimestamp(ts)
    return cym.year, cym.month

def fileswithcym(dirname, whatym):
    results = []
    for f in os.listdir(dirname):
        fullname = os.path.join(dirname, f)
        # if you need to avoid subdirs, uncomment the following line
        # if not os.path.isfile(fullname): continue
        if whatym == cym(fullname):
            results.append(fullname)
    return results

没有任何深刻或困难,正如你所看到的(我还添加了评论,以展示如果你担心这些内容如何跳过子目录)。顺便说一句,如果你真正需要的是走一个子树而不仅仅是一个目录,那么这个改变也是非常本地化的:

def fileswithcymintree(treeroot_dirname, whatym):
    results = []
    for dp, dirs, files in os.walk(treeroot_dirname):
        for f in files:
            fullname = os.path.join(dp, f)
            if whatym == cym(fullname):
                results.append(fullname)
    return results

答案 1 :(得分:2)

上个月相当容易找到 - 例如,参见Alex Martelli的回答 - 但是找到当月最近创建的文件有点困难:

from datetime import date
import os

def filesLastMonth(directory):
    """
    Given a directory, returns a tuple containing
    1. A list with all files made in the previous month (disregards year...)
    2. The file most recently created in the previous month
    """
    def fileCreationTime(filePath):
        return os.path.getctime(filePath)
    today = date.today()
    lastMonth = today.month-1 if today.month != 1 else 12
    # gets each item in the directory that was created last month
    createdLastMonth = [item for item in os.listdir(directory) if
                        date.fromtimestamp(os.path.getctime(item)).month == lastMonth]
    # and this is the most recent of the above
    mostRecentlyLastMonth = max(createdLastMonth, key=fileCreationTime)
    return (createdLastMonth, mostRecentlyLastMonth)

您可以在Windows 上使用os.path.getctime 来获取路径的创建时间,但这在Unix上不起作用 - 在这种情况下不会存储创建时间(你'我只是得到最后一次改变的时间。)

答案 2 :(得分:1)

这里有几个部分被问到......

答案 3 :(得分:0)

http://docs.python.org/library/datetime.html

从上个月的第一个月开始

def first_of( today )
    yr_mn = today.year*12 + (today.month-1) - 1
    return datetime.date( year= yr_mn//12, month= yr_mn%12+1, day=1 )

然后,您可以使用此os.walk来查找相关文件。

答案 4 :(得分:0)

日期操作对于像Labix的python-dateutil这样的库来说是微不足道的。

你想做这样的事情:

In [8]: from dateutil.relativedelta import relativedelta

In [9]: from datetime import date

In [10]: d = date(2010,2,12)

In [11]: print (d-relativedelta(months=1)).month
1

In [12]: print (date(2010,1,4)-relativedelta(months=1)).month
12