【问题标题】:Get fiscal year based on current timestamp-python根据当前时间戳获取会计年度-python
【发布时间】:2019-07-12 17:26:53
【问题描述】:

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

所以经过一番研究,我发现了这个名为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'

但是,当月份转到 8 月时,这将不起作用,因为 datetime.datetime.now().year 不会更改。所以我尝试做类似的事情:

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'))

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

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

py 版本3.6.7

【问题讨论】:

  • 但是,到了八月就不行了”是什么意思?你说的是哪个月份?当前或fiscalyear.START_MONTH?

标签: python python-3.x pandas datetime


【解决方案1】:

我在财政领域的知识接近 0,但根据 [ReadTheDocs]: fiscalyear Documentation:

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

...

每个季度的开始和结束都存储为FiscalDateTime 类的实例。这个类提供了所有 与datetime 类相同的功能,增加了查询财政年度和季度的能力

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

>>> 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我认为你需要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
      

      【讨论】:

      • @anky_91 - 将 x 更改为标量 (r[r.searchsorted(x)-1] + pd.Timedelta(1, 'd')
      【解决方案4】:

      获取样本数据框:

      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
      

      ...我已经使用pd.Grouper() 将这些从 7 月 1 日开始分组,其中键是 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

      【讨论】:

        猜你喜欢
        • 2021-12-04
        • 2016-09-30
        • 2011-12-26
        • 1970-01-01
        • 2019-12-15
        • 2011-10-23
        • 2012-03-04
        • 2011-02-16
        • 1970-01-01
        相关资源
        最近更新 更多