Получить название месяца из номера


230

Как я могу получить название месяца из номера месяца?

Например, если у меня есть 3, я хочу вернутьmarch

date.tm_month()

Как получить строку march?

Ответы:


269

Календарь API

Из этого видно, что calendar.month_name[3]он вернется March, а индекс массива 0- это пустая строка, поэтому не нужно беспокоиться и об индексации нуля.


35
Вы также можете использовать calendar.month_abbr [i] для короткого названия месяца - например, март
Джей Шет

383
import datetime
mydate = datetime.datetime.now()
mydate.strftime("%B")

Возвращает: декабрь

Еще немного информации на сайте Python doc


[РЕДАКТИРОВАТЬ: отличный комментарий от @GiriB] Вы также можете использовать, %bкоторый возвращает краткую запись для названия месяца.

mydate.strftime("%b")

Для приведенного выше примера он вернется Dec.


8
Это не очень полезно, если вам нужно просто знать название месяца для данного числа (1 - 12), так как текущий день не имеет значения. calendar.month_name [i] или calendar.month_abbr [i] более полезны здесь.
Джей Шет

11
mydate.strftime("%b")возвращает короткую запись для названия месяца. (Для приведенного выше примера он вернется Dec)
GiriB

4
ОП хочет использовать целое число в качестве входных данных, а не объект datetime.datetime. Вы можете использовать mydate = datetime.datetime (2019, integer, 1, 0, 0), но это довольно уродливо
Рутгер Хофсте

1
Я не вижу, как это отвечает на вопрос.
cglacet

Что такое% b или% B?
ШерилХоман


36

Это не очень полезно, если вам нужно просто знать название месяца для данного числа (1 - 12), так как текущий день не имеет значения.

calendar.month_name[i]

или

calendar.month_abbr[i]

более полезны здесь.

Вот пример:

import calendar

for month_idx in range(1, 13):
    print (calendar.month_name[month_idx])
    print (calendar.month_abbr[month_idx])
    print ("")

Образец вывода:

January
Jan

February
Feb

March
Mar

...

Спасибо за ваш ответ. если бы я мог добавить предложение, вы могли бы добавить несколько примеров ввода и вывода, чтобы показать, как использовать этот код и разницу между month_nameиmonth_abbr
JMax

Это полезно, я предлагаю использовать range(1, 13)в вашем примере, чтобы вы получили все 12 месяцев на выходе.
davejagoda

Хорошая точка зрения. диапазон (начало, конец) идет от начала, до, но не включая конец. Т.е. использует начало ... конец-1.
ШерилХоман

20
import datetime
mydate = datetime.datetime.now()
mydate.strftime("%B") # 'December'
mydate.strftime("%b") # 'dec'

10

Я предложу это в случае, если (как и я) у вас есть столбец с числами месяцев в кадре данных:

df['monthName'] = df['monthNumer'].apply(lambda x: calendar.month_name[x])

10

Это то, что я хотел бы сделать:

from datetime import *

months = ["Unknown",
          "January",
          "Febuary",
          "March",
          "April",
          "May",
          "June",
          "July",
          "August",
          "September",
          "October",
          "November",
          "December"]

now = (datetime.now())
year = (now.year)
month = (months[now.month])
print(month)

Это выводит:

>>> September

(Это была настоящая дата, когда я написал это)


3

Некоторые хорошие ответы уже используют календарь, но эффект от настройки локали еще не упоминался.

Например, по-французски:

import locale
import calendar

locale.setlocale(locale.LC_ALL, 'fr_FR')

assert calendar.month_name[1] == 'janvier'
assert calendar.month_abbr[1] == 'jan'

Если вы планируете использовать setlocaleв своем коде, обязательно прочитайте разделы с советами, предостережениями и авторами расширений из документации. Показанный здесь пример не является примером того, как его следует использовать. В частности, из этих двух разделов:

Обычно плохая идея вызывать setlocale () в некоторой библиотечной подпрограмме, поскольку в качестве побочного эффекта это влияет на всю программу […]

Модули расширения никогда не должны вызывать setlocale () […]


1
Хорошее дополнение, просто я предлагаю добавить запасную культуру или просто обернуть вызов setLocale в попытку / исключение, потому что, если эта культура недоступна, вы получите исключение (произошло только со мной после попытки;))
firepol

Я думаю, что я оставлю код как есть, потому что установка локали, вероятно, не то, что вы бы сделали в любом случае рядом с этим кодом. Я просто хотел подчеркнуть, как установка языкового стандарта также влияет на значения из calendar. Я могу, возможно, обновить текст.
Cglacet

1

Для произвольного диапазона номеров месяцев

month_integer=range(0,100)
map(lambda x: calendar.month_name[x%12+start],month_integer)

даст правильный список. Настройте start-параметр, с которого начинается январь в списке целых месяцев.


0

8.1. datetime - Основные типы даты и времени - Документация Python 2.7.17 https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

Список всех аргументов strftime. Названия месяцев и такие приятные вещи, как форматирование, оставляют заполнение нулями. Прочитайте полную страницу для таких вещей, как правила для «наивных» аргументов. Вот краткий список:% Солнце, Пн,…, Сб

% Воскресенье, понедельник, ..., суббота

% w Будний день как число, где 0 - воскресенье

% d День месяца 01, 02,…, 31

% b январь, февраль,…, декабрь

% B январь, февраль,…, декабрь

% m Номер месяца в виде нуля 01, 02,…, 12

% y двузначный год с нулевым заполнением 00, 01,…, 99

% Y 4 цифры Год 1970, 1988, 2001, 2013

% H Hour (24-часовой формат) с нулевым заполнением 00, 01,…, 23

% I час (12-часовые часы) с добавлением нуля 01, 02,…, 12

% p AM или PM.

% M минута с добавлением нуля 00, 01,…, 59

% S Второй, дополненный нулями 00, 01,…, 59

% f Микросекунда с нулевым заполнением 000000, 000001,…, 999999

% z UTC смещение в виде + ЧЧММ или -ЧЧММ +0000, -0400, +1030

% Z Название часового пояса UTC, EST, CST

% j День года с нулями 001, 002,…, 366

% U Номер недели года с добавлением нуля, дни до первого воскресенья - неделя 0

% W Номер недели в году (понедельник как первый день)

% c представление даты и времени локали. Вт 16 августа 21:30:00 1988

% x Представление даты локали. 16.08.1988 (en_US)

% X Местное представление времени. 21:30:00

%% буквальный символ "%".


-6

Я создал свою собственную функцию преобразования чисел в соответствующий месяц.

def month_name (number):
    if number == 1:
        return "January"
    elif number == 2:
        return "February"
    elif number == 3:
        return "March"
    elif number == 4:
        return "April"
    elif number == 5:
        return "May"
    elif number == 6:
        return "June"
    elif number == 7:
        return "July"
    elif number == 8:
        return "August"
    elif number == 9:
        return "September"
    elif number == 10:
        return "October"
    elif number == 11:
        return "November"
    elif number == 12:
        return "December"

Тогда я могу вызвать функцию. Например:

print (month_name (12))

Выходы:

>>> December

3
Как показано в других ответах, эта функциональность уже существует во встроенном calendarмодуле. Какая польза от создания собственной функции для воспроизведения тех же результатов? Кроме того, словарь будет намного быстрее, чем серия операторов elif.
Том

4
Помимо всех других проблем, ваша функция работает только для английской локали
mick88
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.