Pythonでの月の名前から月の番号、またはその逆


93

月番号を短縮月名に変換したり、短縮月名を月番号に変換したりできる関数を作成しようとしています。これはよくある質問だと思いましたが、オンラインで見つけることができませんでした。

カレンダーモジュールについて考えていました。月番号から省略された月名に変換するには、たったこれだけで十分ですcalendar.month_abbr[num]。しかし、私は別の方向に進む方法を知りません。これを処理するには、他の方向に変換するための辞書を作成するのが最善の方法でしょうか?または、月の名前から月の番号に、またはその逆に移動するためのより良い方法はありますか?

回答:


95

calendarモジュールを使用して逆辞書を作成します。

import calendar

{v: k for k,v in enumerate(calendar.month_abbr)}

Python(2.7以降)以前は

dict((v,k) for k,v in enumerate(calendar.month_abbr))

これは、何らかの理由で私には機能しません。>>> d = dict(v、k for k、v in calendar.month_abbr)ファイル "<stdin>"、1行目SyntaxError:ジェネレータ式は、唯一の引数でない場合は括弧で
囲む

1
うーん、私はこれを実行し、それは機能しました... d = dict((v、k)for k、v in enumerate(calendar.month_abbr))
Mark_Masoul

@Mark_Masoul:Pythonのバージョンは?かなり古いようです。
S.Lott、2010

calendar.month_abbrは辞書ではなく、<calendar._localized_month instance at 0x0164C9E0>です。Davidのコードの元のバージョンでは、2.6と3.1で構文エラーが発生しました。どちらも()v、kの周りに必要であり、どちらもcalendar.month_abbrを列挙する必要があります。これを修正しました。
Wayne Werner

修正しました。ドキュメントをもっと注意深く読むべきcalendar.month_abbrだったのですが、それが辞書ではなく配列だったので見逃しました。
David Z

77

楽しみのために:

from time import strptime

strptime('Feb','%b').tm_mon

3
これはあなたのロケールに依存しますか?
Janus Troelsen、2015年

Python 2.7 | ValueError:時間データ「FEVは」フォーマットは「%b」が一致していません
ディエゴ・ヴィニシウス

@DiegoViníciusかなり「Fev」が「Feb」になっているはずです。
Fawwaz Yusran

@FawwazYusran Diegoはロケール言語を試してみましたが、コマンドは英語の月の名前に対してのみ機能します
PythoNic

53

使用するカレンダーのモジュールを:

数から大数 calendar.month_abbr[month_number]

数字と数字 list(calendar.month_abbr).index(month_abbr)


例:list(calendar.month_abbr).index( 'Feb')結果:2
kibitzforu

完全な月名を使用する場合:list(calendar.month_name).index('January')
Paul

23

これを行う別の方法を次に示します。

monthToNum(shortMonth):

    return {
            'jan' : 1,
            'feb' : 2,
            'mar' : 3,
            'apr' : 4,
            'may' : 5,
            'jun' : 6,
            'jul' : 7,
            'aug' : 8,
            'sep' : 9, 
            'oct' : 10,
            'nov' : 11,
            'dec' : 12
    }[shortMonth]

次のように同じことを行うことができます:month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))、その後month_cal[shortMonth]
Matt W.

3
それは良い方法です。私が提案した方法では、インポート文は必要ありません。それは好みの問題です。
Gi0rgi0s

20

情報源:Pythonドキュメント

月名から月番号を取得するには、datetimeモジュールを使用します

import datetime
month_number = datetime.datetime.strptime(month_name, '%b').month

# To  get month name
In [2]: datetime.datetime.strftime(datetime.datetime.now(), '%a %b %d, %Y')
Out [2]: 'Thu Aug 10, 2017'

# To get just the month name, %b gives abbrevated form, %B gives full month name
# %b => Jan
# %B => January
dateteime.datetime.strftime(datetime_object, '%b')

16

これは、完全な月の名前も受け入れることができるより包括的な方法です

def month_string_to_number(string):
    m = {
        'jan': 1,
        'feb': 2,
        'mar': 3,
        'apr':4,
         'may':5,
         'jun':6,
         'jul':7,
         'aug':8,
         'sep':9,
         'oct':10,
         'nov':11,
         'dec':12
        }
    s = string.strip()[:3].lower()

    try:
        out = m[s]
        return out
    except:
        raise ValueError('Not a month')

例:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10

これは上記のものより優れています
Gi0rgi0s '13 / 08/13


2

月番号を使用して月名を取得するには、次を使用できますtime

import time

mn = 11
print time.strftime('%B', time.struct_time((0, mn, 0,)+(0,)*6)) 

'November'

そして、月名を使用して月番号を取得するには:

time.strptime("Nov", "%b").tm_mon
11
# or

time.strptime("November", "%B").tm_mon
11

1

上記の考えに基づいて、これは月名を適切な月番号に変更するのに効果的です。

from time import strptime
monthWord = 'september'

newWord = monthWord [0].upper() + monthWord [1:3].lower() 
# converted to "Sep"

print(strptime(newWord,'%b').tm_mon) 
# "Sep" converted to "9" by strptime

たぶん私はあなたが何をしようとしているのかを誤解しているかもしれませんが、それは言葉[0:3]ではないはずですか?
pseudoku

いいえ、もう一度見ると、最初の文字word [0]が大文字で使用され、次の2つの文字word [1:3]に連結されていることがわかります。私が投稿したコードは、月の単語を適切な月番号に変換するのに非常にうまく機能します。
thescoop

0
form month name to number
d=['JAN','FEB','MAR','April','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
N=input()
for i in range(len(d)):
    if d[i] == N:
        month=(i+1)
print(month)

コーディングを説明することは常に優れています
Badro Niaimi

0

代わりに以下を使用できます。

  1. 月間番号:

from time import strptime

strptime('Feb','%b').tm_mon

  1. 月の月数:

import calendar

calendar.month_abbr[2] または calendar.month[2]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.