如何使用Pandas创建days_in_year函数?

时间:2018-05-07 20:35:47

标签: python pandas datetime dataframe

我尝试使用Pandas创建一个简单的列,它将计算相邻日期列中年份的天数。

我已经使用DatetimeIndex的daysinmonth属性相当容易地完成了这个月中的天数,具有以下内容:

def daysinmonth(row):
    x = pd.DatetimeIndex(row['Date']).daysinmonth
    return x  
daysinmonth(df)

我很难在没有漂亮的预定义属性的情况下模仿这些年度的结果。

我的数据框如下所示(因为我试图创建它,所以没有days_in_year列):

        Date       Days_in_month    Days_in_year
1       2/28/2018      28               365
2       4/14/2019      30               365
3       1/1/2020       31               366
4       2/15/2020      29               366

感谢任何看过的人!

6 个答案:

答案 0 :(得分:3)

获取年份模式4,等于0表示366,否则表示365(注意这不包括特殊情况,您可以检查更新功能和我提供的链接)

(pd.to_datetime(df.Date,format='%m/%d/%Y').dt.year%4).eq(0).map({True:366,False:365})
Out[642]: 
1    365
2    365
3    366
4    366
Name: Date, dtype: int64

您可以使用这个更准确的闰年,定义来自site

def daysinyear(x):
    if x%4==0 :
       if x%100==0:

            if x%400==0:
                return(366)
            else:
                return (365)
       else :
           return(365)
    else:
        return(365)


(pd.to_datetime(df.Date,format='%m/%d/%Y').dt.year%4).apply(daysinyear)
Out[656]: 
1    365
2    365
3    366
4    366
Name: Date, dtype: int64

答案 1 :(得分:1)

您也可以使用YearEnd。您将使用此方法获得timedelta64列。

import pandas as pd
from pandas.tseries.offsets import YearEnd
df['Date'] = pd.to_datetime(df.Date)

(df.Date + YearEnd(1)) - (df.Date - YearEnd(1))

1   365 days
2   365 days
3   366 days
4   366 days
Name: Date, dtype: timedelta64[ns]

答案 2 :(得分:1)

这是使用句号的另一种方式:

df['Date'].dt.to_period('A').dt.to_timestamp('A').dt.dayofyear

输出:

1    365
2    365
3    366
4    366
Name: Date, dtype: int64

答案 3 :(得分:0)

我会做这样的事情>

import datetime
    import numpy as np
    def func(date):
        year = date.year
        begin = datetime.datetime(year,1,1)
        end = datetime.datetime(year,12,31)
        diff = (end - begin)
        result = np.timedelta64(diff, "D").astype("int") 
        return  result
    print(func(datetime.datetime(2016,12,31)))

答案 4 :(得分:0)

一种解决方案是采取一年和第二年的第一天。然后计算差异。然后,您可以使用pd.Series.apply

来应用此功能
def days_in_year(x):
    day1 = x.replace(day=1, month=1)
    day2 = day1.replace(year=day1.year+1)
    return (day2 - day1).days

df['Date'] = pd.to_datetime(df['Date'])
df['Days_in_year'] = df['Date'].apply(days_in_year)

print(df)

        Date  Days_in_month  Days_in_year
1 2018-02-28             28           365
2 2019-04-14             30           365
3 2020-01-01             31           366
4 2020-02-15             29           366

答案 5 :(得分:0)

您可以使用基本公式检查一年是否为闰年,并将结果添加到365以获取一年中的天数。

# Not needed if df ['Date'] is already of type datetime
dates = pd.to_datetime(df['Date'])

years = dates.dt.year

ndays = 365 + ((years % 4 == 0) & ((years % 100 != 0) | (years % 400 == 0))).astype(int)