web-dev-qa-db-ja.com

Pythonの日付からn日を引く

ファイルのタイムスタンプからn日を減算したいのですが、機能していないようです。私は この投稿 を読みました、そして私は近いと思います。

これは私のコードからの抜粋です:

import os, time
from datetime import datetime, timedelta

def processData1( pageFile ):
    f = open(pageFile, "r")
    page = f.read()
    filedate = time.strftime('%m/%d/%Y', time.gmtime(os.path.getmtime(pageFile)))
    print filedate
    end_date = filedate - datetime.timedelta(days=10)
    print end_date

filedateの印刷は機能するので、ファイルから日付が正しく読み取られます。機能していないように見えるのは減算ビットです。

望ましい出力:filedateが2013年6月11日の場合、print end_date06/01/2013

6
Isak

time.strftime() を使用すると、実際には _struct_time_ が文字列に変換されます。

したがって、filedateは実際には文字列です。これから_+_または_-_ _datetime.timedelta_を実行しようとすると、エラーが発生します。例-

_In [5]: s = time.strftime('%m/%d/%Y', time.gmtime(time.time()))

In [6]: s
Out[6]: '09/01/2015'

In [8]: s - datetime.timedelta(days=10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-fb1d19ed0b02> in <module>()
----> 1 s - datetime.timedelta(days=10)

TypeError: unsupported operand type(s) for -: 'str' and 'datetime.timedelta'
_

time.gmtime() と同様の動作を得るには、代わりに datetime.datetime.utcfromtimestamp() を使用できます。これにより、日時オブジェクトが提供され、そこからtimedeltaを減算します。

そして、必要な最終結果が実際に文字列である場合は、datetime.strftime()を使用して、必要な形式の文字列に変換できます。例-

_import os
from datetime import datetime, timedelta

def processData1( pageFile ):
    f = open(pageFile, "r")
    page = f.read()
    filedate = datetime.utcfromtimestamp(os.path.getmtime(pageFile)))
    print filedate
    end_date = filedate - timedelta(days=10)
    print end_date   #end_date would be a datetime object.
    end_date_string = end_date.strftime('%m/%d/%Y')
    print end_date_string
_
10
Anand S Kumar

クリーンアップされたインポート

from datetime import datetime, timedelta
start = '06/11/2013'
start = datetime.strptime(start, "%m/%d/%Y") #string to date
end = start - timedelta(days=10) # date - days
print start,end 
15
taesu