Как мне создать функцию days_in_year, используя Pandas? - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь создать простой столбец, используя Pandas, который вычислит количество дней в году в соседнем столбце дат.

Я уже сделал это довольно легко для числа дней в месяце с использованием атрибута daysinmonth DatetimeIndex со следующим:

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 голосов
/ 08 мая 2018

Вот еще один способ использования периодов:

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

Выход:

1    365
2    365
3    366
4    366
Name: Date, dtype: int64
0 голосов
/ 08 мая 2018

Вы можете использовать базовую формулу, чтобы проверить, является ли год високосным, и добавить результат к 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)
0 голосов
/ 08 мая 2018

Одно из решений состоит в том, чтобы взять первый день одного года и следующего года. Затем рассчитайте разницу. Затем вы можете применить это, используя 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
0 голосов
/ 07 мая 2018

Я бы сделал что-то подобное>

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)))
0 голосов
/ 07 мая 2018

Вы также можете использовать 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]
0 голосов
/ 07 мая 2018

Получить режим года на 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

Вы можете использовать это, что является более точным для определения високосного года, определение с этого сайта

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...