Python 如何使用Pandas创建“年中天数”函数?
我正在尝试使用Pandas创建一个简单的列,该列将计算相邻日期列的年份天数 我已经使用DatetimeIndex的daysinmonth属性很容易地完成了月份天数的计算,如下所示:Python 如何使用Pandas创建“年中天数”函数?,python,pandas,datetime,dataframe,Python,Pandas,Datetime,Dataframe,我正在尝试使用Pandas创建一个简单的列,该列将计算相邻日期列的年份天数 我已经使用DatetimeIndex的daysinmonth属性很容易地完成了月份天数的计算,如下所示: def daysinmonth(row): x = pd.DatetimeIndex(row['Date']).daysinmonth return x daysinmonth(df) 如果没有漂亮的预定义属性,我很难在一年内模拟这些结果 我的数据框如下所示(自从我尝试创建该数据框以来,没有“年
def daysinmonth(row):
x = pd.DatetimeIndex(row['Date']).daysinmonth
return x
daysinmonth(df)
如果没有漂亮的预定义属性,我很难在一年内模拟这些结果
我的数据框如下所示(自从我尝试创建该数据框以来,没有“年中的天数”列):
感谢所有看过的人 按4获取年份模式,等于0表示366,否则表示365(注意,这不包括特殊情况,您可以检查更新功能和我提供的链接) 你可以用它来定义闰年,它更准确
您也可以使用
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]
我会这样做>
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)))
一个解决办法是在一年的第一天和下一年的第一天。然后计算差值。然后,您可以使用pd.Series应用此功能。应用:
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
您可以使用基本公式检查一年是否为闰年,并将结果添加到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)
下面是使用句点的另一种方法:
df['Date'].dt.to_period('A').dt.to_timestamp('A').dt.dayofyear
输出:
1 365
2 365
3 366
4 366
Name: Date, dtype: int64
这听起来是一个很好的解决方案!不过,我有一个非常初级的后续问题:我应该如何看待您使用df.Date?我从来都不知道如何将列名用作属性——如果我的列名是两个单词,会发生什么情况?@Ben,那么你需要使用df['datesomething']
# 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)
df['Date'].dt.to_period('A').dt.to_timestamp('A').dt.dayofyear
1 365
2 365
3 366
4 366
Name: Date, dtype: int64