ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Pythonコミュのdatetime関数

  • mixiチェック
  • このエントリーをはてなブックマークに追加
python初心者のharrisonと申します。
datetimeモジュールを使って先月の初日と末日を返すような関数を書きたいと思っていますが、
そもそも「先月の…」という表現が思いつきません。もしご存知の方がいらっしゃいましたらご教示
いただけますと幸いです。よろしくお願いいたします。

コメント(13)

date.replace()
http://www.python.jp/doc/2.4/lib/datetime-date.html
とtimedeltaオブジェクト
http://www.python.jp/doc/2.4/lib/datetime-timedelta.html
を使えばできる気がします。

phpとjavascriptではやったことあるんですが、pythonでは実際にやったことないので「気がする」ですみません(汗
unix時間が1234567890になる、というのに関連して調べたところです。
こいつはサードパーティのdateutilモジュールが楽です。
pypiにあります。
http://pypi.python.org/pypi/python-dateutil/1.4.1

>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> today = datetime.date.today()
>>> today
datetime.date(2009, 2, 13)
>>> today + relativedelta(months=-1)
datetime.date(2009, 1, 13)
>>> today + relativedelta(months=-1, day=1)
datetime.date(2009, 1, 1)
>>> today + relativedelta(months=-1, day=31)
datetime.date(2009, 1, 31)
>>> today + relativedelta(months=-1, days=31)
datetime.date(2009, 2, 13)
>>>
自前でで書くならcalendarモジュールのcalendar.mdaysかな?
http://mixi.jp/view_bbs.pl?id=33133072&comm_id=1389875&page=all
の7の御題への回答とかが参考になるかと
>「先月の…」という表現

アルゴリズムの話なら
「先月の末日」は「今月の初日の前日」
「月の初日」は「その月の1日」、ということ?

>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2009, 2, 13)
>>> today.year
2009
>>> today.month
2
>>> today.day
13
>>> first_day_of_this_month = datetime.date(today.year, today.month, 1)
>>> first_day_of_this_month
datetime.date(2009, 2, 1)
>>> end_of_last_month = first_day_of_this_month - datetime.timedelta(1)
>>> end_of_last_month
datetime.date(2009, 1, 31)
>>> datetime.date(end_of_last_month.year, end_of_last_month.month, 1)
datetime.date(2009, 1, 1)
>>>
>アルゴリズムの話なら
>「先月の末日」は「今月の初日の前日」
>「月の初日」は「その月の1日」、ということ?

月の初日(日付を1にする)を起点にする,この方法がシンプルでいいですね:-D。
こういうのって,普段の生活態度とか観察力がものを言うんですよね。優秀な開発者は観察力がするどいことが多いと思います。

timedelta()にはdays,secondsなどの引数を渡すことができます。キーワード指定しないでtimedelta(1)のようにオブジェクトを作ると,日にちを指定したと解釈されます。

ところで,同じように「翌月の1日」を取得するにはどうすればいいか,考えてみませんか?
ありがとうございました!
皆さんのおかげで月初、月末を返す関数を作ることができました。
そこで、もう一つご質問がございます。(ずうずうしくてすみません)
そもそも、最初の質問はadodbapiでSQLを流す為にそのSQL文の中に入れるべき
月初、月末の日付がほしいという要望を元に質問させていただきました。
以下が作成したスクリプトです。

#! /cygdrive/c/Python26/python
# -*- coding: shift_jis -*-

import adodbapi
import datetime

""" 前月の初日を返す関数
"""
def first_day_of_last_month():
today = datetime.date.today()
end_of_last_month = datetime.date(today.year,today.month,1)-datetime.timedelta(1)
first_day_of_last_month = datetime.date(end_of_last_month.year, end_of_last_month.month, 1)
return first_day_of_last_month

""" 前月の末日を返す関数
"""
def end_of_last_month():
today = datetime.date.today()
end_of_last_month = datetime.date(today.year,today.month,1)-datetime.timedelta(1)
return end_of_last_month

""" 出力する
"""
FIRST_DAY_OF_LAST_MONTH = first_day_of_last_month()
END_OF_LAST_MONTH = end_of_last_month()

""" DBへ接続する
"""
conn_str = """provider=SQLOLEDB;←SQL Serverです。
Data Source=***.***.***.***;
User ID=*****;
Password=*****;
Initial Catalog=*******"""
conn = adodbapi.connect(conn_str)
cur = conn.cursor()

STRSQL = "select users from user_tables where useddate between %s and %s" % (FIRST_DAY_OF_LAST_MONTH,END_OF_LAST_MONTH)
print STRSQL
←ココまでは上手く行っているみたいに見えます。

cur.execute("STRSQL")←★この行でエラーが出力されています。

for c in cur.fetchall():

print c[0]

上記の通り、STRSQLで理想的なSQLを作成できたので、早速★でそのSQLを実行しようとしましたが、エラーとなってしまいました。

Connectionオブジェクトのヘルプには

execute( sql, [parameters])
このメソッドは非標準のショートカットで、cursor メソッドを呼び出して中間的なカーソルオブジェクトを作り、そのカーソルの execute メソッドを与えられたパラメータと共に呼び出します。

と記載されており、SQL部分に適切な文字列が入ればSQLの実行はできると思うのですが・・・
根本的な間違い(sql文字列として変数は使用できないなど)がありましたら、ご教示頂けると幸いです。よろしくお願いいたします。
> unix時間が1234567890になる、というのに関連して調べたところです。
http://wiredvision.jp/news/200902/2009021320.html
なるほど。

人が使う時刻システムとは異なり、UNIX時間は、協定世界時(UTC)1970年1月1日午前0時からの秒数を単純にカウントしている。コンピューターにとっては、経過した時間を計算するにはこのやり方が便利なのだ――起点の日時が1970年より前でない限り。

うるう秒はunix時間ではカウントされない、で正しいですよね?
> cur.execute("STRSQL")←★この行でエラーが出力されています。
cur.execute(STRSQL)
だよね?
#これじゃないことを祈る。
> cur.execute("STRSQL")←★この行でエラーが出力されています。
cur.execute(STRSQL)
だよね?
#これじゃないことを祈る。

→すみませんこれでした・・・ふらふら
もっと修行します。
早速のご回答ありがとうございました。
> うるう秒はunix時間ではカウントされない、で正しいですよね?

わりかしアドホックに挿入されるものなのでカウントされないと思ってたんだけど、Wikipedia見るとNTPには入っているんですね。

「閏秒」
http://ja.wikipedia.org/wiki/%E9%96%8F%E7%A7%92

で、実際にうるう秒が考慮されるかどうかはシステムによる模様:

「NTP うるう秒(閏秒)」
http://www.bsddiary.net/doc/ntpd-leapseconds.html

考えてみれば
>>> (1234567890-30)/60.0
20576131.0
>>>
で割り切れるということは考慮されてませんね。
ウチのMac OS Xも対応してませんでした:

2006年1月1日8時59分60秒の閏秒挿入直前:
>>> time.mktime((2006,01,01,8,59,59,0,0,0))
1136073599.0

閏秒挿入時:
>>> time.mktime((2006,01,01,8,59,60,0,0,0))
1136073600.0

挿入されてなければ同じ時間:
>>> time.mktime((2006,01,01,9,00,0,0,0,0))
1136073600.0
>>>

逆に、対応してるシステムってどんなのがあるんだろう。
そういえばと、つらつら思い出したのですけれど、datetime から timestamp を求める方法は結構頭をひねりました。

timestamp -> datetime は datetime.fromtimestamp でいけるのですけれど、逆が面倒でした。みなさんはどうされていますか?
mixi だとインデントの量がわからないですねw
→WMさん

アップするときに
http://mixi.jp/view_bbs.pl?id=20226712&comm_id=6869
を使うとよいです。


→Kawaiさん

どんな問題のことかなと思っていたけど、
http://mp.i-revo.jp/user.php/kcvcrlkq/entry/347.html
これだったんですね。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Python 更新情報

Pythonのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング