รับชื่อเดือนจากหมายเลข


230

ฉันจะรับชื่อเดือนจากหมายเลขเดือนได้อย่างไร

ตัวอย่างเช่นถ้าฉัน3ฉันต้องการกลับmarch

date.tm_month()

วิธีการรับสายmarch?

คำตอบ:


269

Calendar API

จากนั้นคุณจะเห็นว่าcalendar.month_name[3]จะส่งคืนMarchและดัชนีอาร์เรย์ของ0เป็นสตริงว่างดังนั้นไม่จำเป็นต้องกังวลเกี่ยวกับการทำดัชนีศูนย์


35
นอกจากนี้คุณยังสามารถใช้ calendar.month_abbr [i] สำหรับชื่อเดือนสั้น ๆ - เช่น Mar.
Jay Sheth

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

คืนค่า: ธันวาคม

ข้อมูลเพิ่มเติมบางส่วนเกี่ยวกับเว็บไซต์ Python doc


[แก้ไข: ความคิดเห็นที่ดีจาก @GiriB] นอกจากนี้คุณยังสามารถใช้%bซึ่งส่งกลับสัญกรณ์สั้น ๆ สำหรับชื่อเดือน

mydate.strftime("%b")

Decตัวอย่างข้างต้นก็จะกลับมา


7
ไม่เป็นประโยชน์หากคุณต้องการทราบชื่อเดือนสำหรับหมายเลขที่ระบุ (1 - 12) เนื่องจากวันปัจจุบันไม่สำคัญ calendar.month_name [i] หรือ calendar.month_abbr [i] มีประโยชน์มากขึ้นที่นี่
Jay Sheth

11
mydate.strftime("%b")ส่งคืนสัญกรณ์สั้น ๆ สำหรับชื่อเดือน (สำหรับตัวอย่างข้างต้นมันจะกลับมาDec)
GiriB

3
OP ต้องการใช้จำนวนเต็มเป็นอินพุตไม่ใช่วัตถุ datetime.datetime คุณสามารถใช้ mydate = datetime.datetime (2019 จำนวนเต็ม 1, 0, 0) แต่มันน่าเกลียดมาก
Rutger Hofste

ฉันล้มเหลวในการดูว่าวิธีนี้ตอบคำถาม
cglacet


35

ไม่เป็นประโยชน์หากคุณต้องการทราบชื่อเดือนสำหรับหมายเลขที่ระบุ (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


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

สำหรับช่วง Arbitay ของตัวเลขเดือน

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

จะให้รายการที่ถูกต้อง ปรับstartพารามิเตอร์จากตำแหน่งที่มกราคมเริ่มในรายการเดือนจำนวนเต็ม


0

8.1 วันที่และเวลา - ประเภทวันที่และเวลาพื้นฐาน - เอกสาร Python 2.7.17 https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

รายการข้อโต้แย้ง strftime ทั้งหมด ชื่อของเดือนและสิ่งที่ดีเช่นการจัดรูปแบบการเติมด้านซ้ายเป็นศูนย์ อ่านหน้าเต็มสำหรับสิ่งต่าง ๆ เช่นกฎสำหรับข้อโต้แย้ง "ไร้เดียงสา" นี่คือรายการโดยย่อ:% a Sun, Mon, …, Sat

% วันอาทิตย์วันจันทร์…วันเสาร์

% w วันทำงานเป็นตัวเลขโดยที่ 0 คือวันอาทิตย์

% d วันที่เดือน 01, 02, …, 31

% b ม.ค. , ก.พ. , …, ธ.ค.

% B มกราคม, กุมภาพันธ์, …, ธันวาคม

% m จำนวนเดือนในรูปแบบ zero-padded 01, 02, …, 12

% y 2 หลักปีศูนย์ zero-padded 00, 01, …, 99

% Y 4 หลักปี 1970, 1988, 2001, 2013

% H ชั่วโมง (นาฬิกา 24 ชั่วโมง) zero-padded 00, 01, …, 23

% I Hour (นาฬิกา 12 ชั่วโมง) zero-padded 01, 02, …, 12

% p AM หรือ PM

% M นาที zero-padded 00, 01, …, 59

% S แผ่นที่สองเป็นศูนย์ 00, 01, …, 59

% f Microsecond zero-padded 000000, 000001, …, 999999

% z UTC ชดเชยในรูปแบบ + HHMM หรือ -HHMM +0000, -0400, +1030

% Z ชื่อโซนเวลา UTC, EST, CST

% j วันที่ไม่มีการเสริมเบาะในปี 001, 002, …, 366

จำนวน% U สัปดาห์ของปีศูนย์เต็มจำนวนวันก่อนวันอาทิตย์แรกคือสัปดาห์ที่ 0

จำนวน% W สัปดาห์ของปี (วันจันทร์เป็นวันแรก)

การแสดงวันที่และเวลาของ% c สถานที่ อังคาร 16 ส.ค. 21:30:00 น

การแสดงวันที่ของ% x สถานที่ 08/16/1988 (en_US)

การแสดงเวลาของ% X Locale 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.