根据当前时间戳获取会计年度-python

时间:2019-02-19 09:03:44

标签: python python-3.x pandas datetime

  
    

我正在尝试根据今天的日期获取财政年度的开始日期。

  

因此,经过一番研究,我发现此软件包名为fiscalyear,您可以在其中修改会计年度的开始日期。就我而言,我希望 01-07-year 作为会计年度的开始日期,因此我将fiscalyear.START_MONTH = 7

设置为

我尝试了以下方法(如果您pip install fiscalyear,则是可重复的示例):

import datetime
import fiscalyear
fiscalyear.START_MONTH = 7
a = fiscalyear.FiscalYear(datetime.datetime.now().year).start.date()
a.strftime('%Y-%m-%d')

哪些输出正确:

'2018-07-01'

但是,由于月份datetime.datetime.now().year不变,因此当月份变为8月时,这将不起作用。所以我尝试做类似的事情:

if (datetime.datetime.now()-pd.to_datetime('2018-07-01')).days < 365:
    a = fiscalyear.FiscalYear(datetime.datetime.now().year).start.date()
    print(a.strftime('%Y-%m-%d'))
else:
    a = fiscalyear.FiscalYear(datetime.datetime.now().year+1).start.date()
    print(a.strftime('%Y-%m-%d'))

我对自己正在做的事情有不好的感觉,因为这现在也可能适用于leap年。

  
    

在python中是否有更好的方法可以根据当前时间戳检测会计年度的开始日期?

  

py版本3.6.7

4 个答案:

答案 0 :(得分:4)

我在财政领域的知识接近 0 ,但是根据https://docs.developer.swisscom.com/concepts/container-security.html

  

FiscalYear类提供了一个对象,用于存储有关特定会计年度开始和结束的信息。

     

...

     

每个季度的开始和结束都存储为FiscalDateTime类的实例。本课程提供所有   与datetime类具有相同的功能,并具有查询会计年度和季度的功能

因此, FiscalYear 不能与日期一起使用,而是 FiscalDateTime (或更简单的兄弟姐妹: FiscalDate )。

>>> import fiscalyear
>>> fiscalyear.START_MONTH = 7
>>>
>>> cur_y = fiscalyear.FiscalYear(datetime.datetime.now().year)
>>> cur_y.start.date()
datetime.date(2018, 7, 1)
>>> cur_y.end.date()
datetime.date(2019, 6, 30)
>>>
>>> cur_dt = fiscalyear.FiscalDate(2019, 2, 19)  # Current date (at answer time)
>>> cur_dt.fiscal_year
2019
>>>
>>> jul_dt = fiscalyear.FiscalDate(2019, 7, 19)  # A date past July 1st (when the fiscal year should change)
>>> jul_dt.fiscal_year
2020

答案 1 :(得分:3)

您可以尝试以下代码,它对我有用:

>>> import fiscalyear
>>> fiscalyear.START_MONTH = 4
>>> fiscalyear.FiscalYear.current()
FiscalYear(2021)
>>> 

答案 2 :(得分:1)

我认为您需要searchsorted和助手DatetimeIndex

r = pd.to_datetime([f'{x}-06-30' for x in range(1970, 2021)])
#print (r)

for x in ['2017-07-01','2017-07-02','2018-06-30','2019-02-19','2019-08-19']:
    out = (r[r.searchsorted(pd.Timestamp(x))] + pd.Timedelta(1, 'd')).year
    print (out)
2018
2018
2018
2019
2020

答案 3 :(得分:0)

获取示例数据框:

pd.DataFrame(dict(
    dates=[pd.datetime(2018, 6, 1), pd.datetime(2018, 7, 1), pd.datetime(2018, 7, 2)],
    values=[0]*3
))

       dates  values
0 2018-06-01       0
1 2018-07-01       0
2 2018-07-02       0

...从7月1日开始,我一直使用pd.Grouper()将它们归类,其中键为AS-JUL,即“每年7月开始”

df.groupby(pd.Grouper(freq='AS-JUL', key='dates')).count()
            values
            values
dates             
2017-07-01       1
2018-07-01       2

您可以在此处看到2018-07-01在操作后仍为2018-07-01