我尝试使用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
感谢任何看过的人!
答案 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)