Numbers of Day in Month

后端 未结 4 910
再見小時候
再見小時候 2020-12-11 05:03

I have a data frame with a date time index, and I would like to multiply some columns with the number of days in that month.

                   TUFNWGTP  TEL         


        
相关标签:
4条回答
  • 2020-12-11 05:29
    import pandas as pd
    from pandas.tseries.offsets import MonthEnd
    
    df['dim'] = (pd.to_datetime(df.index) + MonthEnd(0)).dt.day
    

    You can omit pd.to_datetime(), if your index is already DatetimeIndex.

    0 讨论(0)
  • 2020-12-11 05:45

    pd.tslib.monthrange is an unadvertised / undocumented function that handles the days_in_month calculation (adjusting for leap years). This could/should prob be added as a property to Timestamp/DatetimeIndex.

    In [34]: df = DataFrame({'date' : pd.date_range('20120101',periods=15,freq='M') })
    
    In [35]: df['year'] = df['date'].dt.year
    
    In [36]: df['month'] = df['date'].dt.month
    
    In [37]: df['days_in_month'] = df.apply(lambda x: pd.tslib.monthrange(x['year'],x['month'])[1], axis=1)
    
    In [38]: df
    Out[38]: 
             date  year  month  days_in_month
    0  2012-01-31  2012      1             31
    1  2012-02-29  2012      2             29
    2  2012-03-31  2012      3             31
    3  2012-04-30  2012      4             30
    4  2012-05-31  2012      5             31
    5  2012-06-30  2012      6             30
    6  2012-07-31  2012      7             31
    7  2012-08-31  2012      8             31
    8  2012-09-30  2012      9             30
    9  2012-10-31  2012     10             31
    10 2012-11-30  2012     11             30
    11 2012-12-31  2012     12             31
    12 2013-01-31  2013      1             31
    13 2013-02-28  2013      2             28
    14 2013-03-31  2013      3             31
    
    0 讨论(0)
  • 2020-12-11 05:46

    Here is a little clunky hand-made method to get the number of days in a month

    import datetime
    
    def days_in_month(dt):
      next_month = datetime.datetime(
          dt.year + dt.month / 12, dt.month % 12 + 1, 1)
      start_month = datetime.datetime(dt.year, dt.month, 1)
      td = next_month - start_month
      return td.days
    

    For example:

    >>> days_in_month(datetime.datetime.strptime('2013-12-12', '%Y-%m-%d'))
    31
    >>> days_in_month(datetime.datetime.strptime('2013-02-12', '%Y-%m-%d'))
    28
    >>> days_in_month(datetime.datetime.strptime('2012-02-12', '%Y-%m-%d'))
    29
    >>> days_in_month(datetime.datetime.strptime('2012-01-12', '%Y-%m-%d'))
    31
    >>> days_in_month(datetime.datetime.strptime('2013-11-12', '%Y-%m-%d'))
    30
    

    I let you figure out how to read your table and do the multiplication yourself :)

    0 讨论(0)
  • 2020-12-11 05:55

    There is now a Series.dt.daysinmonth attribute for datetime series. Here is an example based on Jeff's answer.

    In [3]: df = pd.DataFrame({'date' : pd.date_range('20120101',periods=15,freq='M') })
    
    In [4]: df['year'] = df['date'].dt.year
    
    In [5]: df['month'] = df['date'].dt.month
    
    In [6]: df['days_in_month'] = df['date'].dt.daysinmonth
    
    In [7]: df
    Out[7]:
             date  year  month  days_in_month
    0  2012-01-31  2012      1             31
    1  2012-02-29  2012      2             29
    2  2012-03-31  2012      3             31
    3  2012-04-30  2012      4             30
    4  2012-05-31  2012      5             31
    5  2012-06-30  2012      6             30
    6  2012-07-31  2012      7             31
    7  2012-08-31  2012      8             31
    8  2012-09-30  2012      9             30
    9  2012-10-31  2012     10             31
    10 2012-11-30  2012     11             30
    11 2012-12-31  2012     12             31
    12 2013-01-31  2013      1             31
    13 2013-02-28  2013      2             28
    14 2013-03-31  2013      3             31
    
    0 讨论(0)
提交回复
热议问题