แน่นอนว่าฉันสามารถเขียนสิ่งนี้ด้วยตัวเอง แต่ก่อนที่ฉันจะสร้างวงล้อใหม่มีฟังก์ชันที่ทำสิ่งนี้อยู่แล้วหรือไม่?
pandas.Series.dt.quarter
A:
แน่นอนว่าฉันสามารถเขียนสิ่งนี้ด้วยตัวเอง แต่ก่อนที่ฉันจะสร้างวงล้อใหม่มีฟังก์ชันที่ทำสิ่งนี้อยู่แล้วหรือไม่?
pandas.Series.dt.quarter
A:
คำตอบ:
ได้รับตัวอย่างx
ของdatetime.date , (x.month-1)//3
จะทำให้คุณไตรมาส (0 สำหรับไตรมาสแรก 1 สำหรับไตรมาสที่สอง ฯลฯ - เพิ่ม 1 ถ้าคุณต้องการที่จะนับตั้งแต่วันที่ 1 แทน ;-)
แต่เดิมคำตอบสองคำตอบทวีคูณและได้รับการยอมรับในตอนแรก (ทั้งที่ถูกลบในปัจจุบัน) เป็นบั๊กกี้ - ไม่ได้ทำ-1
ก่อนการหารและหารด้วย 4 แทน 3 เนื่องจาก.month
ไปที่ 1 ถึง 12 จึงง่ายต่อการตรวจสอบตัวเองว่าสูตรใด ขวา:
for m in range(1, 13):
print m//4 + 1,
print
ให้1 1 1 2 2 2 2 3 3 3 3 4
- สองไตรมาสสี่เดือนและหนึ่งเดือนเดียว (eep)
for m in range(1, 13):
print (m-1)//3 + 1,
print
ให้1 1 1 2 2 2 3 3 3 4 4 4
- ตอนนี้รูปลักษณ์นี้ไม่เหมาะกับคุณมากหรือ -)
นี่เป็นการพิสูจน์ว่าคำถามนี้ได้รับการรับรองอย่างดีฉันคิดว่า ;-)
ฉันไม่คิดว่าโมดูลวันที่และเวลาควรมีฟังก์ชันปฏิทินที่เป็นประโยชน์ทุกอย่างที่เป็นไปได้ แต่ฉันรู้ว่าฉันดูแลdatetools
โมดูล(ผ่านการทดสอบอย่างดี ;-) สำหรับการใช้โครงการ (และอื่น ๆ ) ของฉันในที่ทำงานซึ่งมีเพียงเล็กน้อย ฟังก์ชั่นในการคำนวณปฏิทินเหล่านี้ทั้งหมด - บางส่วนมีความซับซ้อนบางอย่างเรียบง่าย แต่ไม่มีเหตุผลที่จะทำงานซ้ำแล้วซ้ำอีก (แม้แต่งานง่ายๆ) หรือมีข้อบกพร่องในการคำนวณดังกล่าว ;-)
(m+2)//3
แทน(m-1)//3 + 1
หากคุณใช้งานอยู่แล้วpandas
มันค่อนข้างง่าย
import datetime as dt
import pandas as pd
quarter = pd.Timestamp(dt.date(2016, 2, 29)).quarter
assert quarter == 1
หากคุณมีdate
คอลัมน์ในดาต้าเฟรมคุณสามารถสร้างquarter
คอลัมน์ใหม่ได้อย่างง่ายดาย:
df['quarter'] = df['date'].dt.quarter
pandas.Series.dt.quarter
เป็นโซลูชันที่ดีเมื่อคุณมีค่าวันที่และเวลาในวัตถุDataframeหรือSeries
ฉันขอแนะนำวิธีแก้ปัญหาอื่นที่สะอาดกว่า ถ้า X เป็นdatetime.datetime.now()
อินสแตนซ์ไตรมาสจะเป็น:
import math
Q=math.ceil(X.month/3.)
ต้องนำเข้า ceil จากโมดูลคณิตศาสตร์เนื่องจากไม่สามารถเข้าถึงได้โดยตรง
math.ceil(float(4)/3) = 2.0
ในขณะที่math.ceil(4/3) = 1.0
.
หลังจากทั้ง 3 คนทำอะไร math.ceil(4/3.) = 2.0
สำหรับใครก็ตามที่พยายามหาไตรมาสของปีงบประมาณซึ่งอาจแตกต่างจากปีปฏิทินฉันเขียนโมดูล Python เพื่อทำสิ่งนี้
การติดตั้งทำได้ง่าย เพียงแค่เรียกใช้:
$ pip install fiscalyear
ไม่มีการอ้างอิงและfiscalyear
ควรใช้ได้กับทั้ง Python 2 และ 3
มันเป็นพื้นห่อหุ้มรอบตัวในวันที่และเวลาโมดูลใด ๆ ดังนั้นdatetime
คำสั่งที่คุณคุ้นเคยกับการทำงานประสงค์ นี่คือตัวอย่าง:
>>> from fiscalyear import *
>>> a = FiscalDate.today()
>>> a
FiscalDate(2017, 5, 6)
>>> a.fiscal_year
2017
>>> a.quarter
3
>>> b = FiscalYear(2017)
>>> b.start
FiscalDateTime(2016, 10, 1, 0, 0)
>>> b.end
FiscalDateTime(2017, 9, 30, 23, 59, 59)
>>> b.q3
FiscalQuarter(2017, 3)
>>> b.q3.start
FiscalDateTime(2017, 4, 1, 0, 0)
>>> b.q3.end
FiscalDateTime(2017, 6, 30, 23, 59, 59)
fiscalyear
โฮสต์บนGitHubและPyPI เอกสารสามารถพบได้ที่อ่านเอกสาร หากคุณกำลังมองหาฟีเจอร์ที่ยังไม่มีในตอนนี้โปรดแจ้งให้เราทราบ!
นี่คือตัวอย่างของฟังก์ชันที่ได้รับวัตถุ datetime.datetime และส่งคืนสตริงที่ไม่ซ้ำกันสำหรับแต่ละไตรมาส:
from datetime import datetime, timedelta
def get_quarter(d):
return "Q%d_%d" % (math.ceil(d.month/3), d.year)
d = datetime.now()
print(d.strftime("%Y-%m-%d"), get_q(d))
d2 = d - timedelta(90)
print(d2.strftime("%Y-%m-%d"), get_q(d2))
d3 = d - timedelta(180 + 365)
print(d3.strftime("%Y-%m-%d"), get_q(d3))
และผลลัพธ์คือ:
2019-02-14 Q1_2019
2018-11-16 Q4_2018
2017-08-18 Q3_2017
ถ้าm
เป็นเลขเดือน ...
import math
math.ceil(float(m) / 3)
วิธีนี้ใช้ได้กับการทำแผนที่ใด ๆ :
month2quarter = {
1:1,2:1,3:1,
4:2,5:2,6:2,
7:3,8:3,9:3,
10:4,11:4,12:4,
}.get
เราเพิ่งสร้างฟังก์ชัน int->int
month2quarter(9) # returns 3
วิธีนี้ยังพิสูจน์ได้
month2quarter(-1) # returns None
month2quarter('July') # returns None
สำหรับผู้ที่กำลังมองหาข้อมูลรายไตรมาสของปีการเงินโดยใช้แพนด้า
import datetime
import pandas as pd
today_date = datetime.date.today()
quarter = pd.PeriodIndex(today_date, freq='Q-MAR').strftime('Q%q')
อ้างอิง: ดัชนีช่วงเวลาแพนด้า
นี่เป็นคำถามเก่า แต่ยังควรค่าแก่การอภิปราย
นี่คือวิธีแก้ปัญหาของฉันโดยใช้โมดูลdateutil ที่ยอดเยี่ยม
from dateutil import rrule,relativedelta
year = this_date.year
quarters = rrule.rrule(rrule.MONTHLY,
bymonth=(1,4,7,10),
bysetpos=-1,
dtstart=datetime.datetime(year,1,1),
count=8)
first_day = quarters.before(this_date)
last_day = (quarters.after(this_date)
-relativedelta.relativedelta(days=1)
ดังนั้นfirst_day
คือวันแรกของไตรมาสและlast_day
เป็นวันสุดท้ายของไตรมาส (คำนวณโดยการหาวันแรกของไตรมาสถัดไปลบหนึ่งวัน)
มันง่ายมากและใช้งานได้ใน python3:
from datetime import datetime
# Get current date-time.
now = datetime.now()
# Determine which quarter of the year is now. Returns q1, q2, q3 or q4.
quarter_of_the_year = 'q'+str((now.month-1)//3+1)
อืมดังนั้นการคำนวณอาจผิดพลาดนี่เป็นเวอร์ชันที่ดีกว่า (เพื่อประโยชน์ของมัน)
first, second, third, fourth=1,2,3,4# you can make strings if you wish :)
quarterMap = {}
quarterMap.update(dict(zip((1,2,3),(first,)*3)))
quarterMap.update(dict(zip((4,5,6),(second,)*3)))
quarterMap.update(dict(zip((7,8,9),(third,)*3)))
quarterMap.update(dict(zip((10,11,12),(fourth,)*3)))
print quarterMap[6]
"it is difficult to see correctness except by testing it"
เช่นเดียวกับที่คุณกล่าวว่า คุณควรจะเขียนข้อสอบตามที่นักพัฒนาที่ดีทุกคนควรทำ การทดสอบคือสิ่งที่ช่วยป้องกันไม่ให้คุณทำผิดพลาดและจับสิ่งที่คุณทำ นักพัฒนาไม่ควรเสียสละประสิทธิภาพและความสามารถในการอ่านเพื่อป้องกันไม่ให้ตัวเองทำผิดพลาด นอกจากนี้ยังอ่านได้น้อยกว่าหากคุณสร้างคำสั่งแบบคงที่โดยใช้ตัวอักษร
(m-1)//3 + 1
ไม่ใช่ทั้งหมดที่อ่านได้เช่นกันมีคนจำนวนไม่น้อยที่รู้ว่า//
ทำอะไร ความคิดเห็นเดิมของฉันเป็นเพียงข้อความ"calculations can go wrong"
ที่ฟังดูแปลกสำหรับฉัน
นี่คือโซลูชันแบบละเอียด แต่ยังสามารถอ่านได้ซึ่งจะใช้ได้กับอินสแตนซ์วันที่เวลาและวันที่
def get_quarter(date):
for months, quarter in [
([1, 2, 3], 1),
([4, 5, 6], 2),
([7, 8, 9], 3),
([10, 11, 12], 4)
]:
if date.month in months:
return quarter
โดยใช้พจนานุกรมคุณสามารถดึงสิ่งนี้ออกได้โดย
def get_quarter(month):
quarter_dictionary = {
"Q1" : [1,2,3],
"Q2" : [4,5,6],
"Q3" : [7,8,9],
"Q4" : [10,11,12]
}
for key,values in quarter_dictionary.items():
for value in values:
if value == month:
return key
print(get_quarter(3))