【Pandas】pandas Index objects DatetimeIndex.dayofyear
Pandas2.2 Index objects
Time date components
方法 | 描述 |
---|---|
DatetimeIndex.year | 用于获取 DatetimeIndex 中每个日期时间元素的年份部分 |
DatetimeIndex.month | 用于获取 DatetimeIndex 中每个日期时间元素的月份部分 |
DatetimeIndex.day | 用于获取 DatetimeIndex 中每个日期时间元素的日期部分(月份中的第几天) |
DatetimeIndex.hour | 用于获取 DatetimeIndex 中每个日期时间元素的小时部分 |
DatetimeIndex.minute | 用于获取 DatetimeIndex 中每个日期时间元素的分钟部分 |
DatetimeIndex.second | 用于获取 DatetimeIndex 中每个日期时间元素的秒部分 |
DatetimeIndex.microsecond | 用于获取 DatetimeIndex 中每个日期时间元素的微秒部分 |
DatetimeIndex.nanosecond | 用于获取时间戳中的纳秒部分(0-999999999) |
DatetimeIndex.date | 用于获取时间戳中的日期部分(年-月-日) |
DatetimeIndex.time | 用于获取时间戳中的时间部分(时:分:秒) |
DatetimeIndex.timetz | 用于获取带有时区信息的时间部分(时:分:秒) |
DatetimeIndex.dayofyear | 用于获取时间戳在一年中的天数序号 |
pandas.DatetimeIndex.dayofyear 属性详解
pandas.DatetimeIndex.dayofyear
是 DatetimeIndex 对象的一个属性,用于获取时间戳在一年中的天数序号(1月1日为1,12月31日为365或366)。
属性说明
- 返回类型: 一个包含每个时间戳在一年中天数的整数数组(numpy.ndarray)
- 取值范围:
- 平年: 1-365
- 闰年: 1-366
- 别名: 也可以使用
day_of_year
访问相同属性 - 特点:
- 不考虑时间部分,只基于日期计算
- 自动处理闰年情况
使用示例
示例1:基本用法
import pandas as pd# 创建包含不同日期的DatetimeIndex
dates = pd.DatetimeIndex(['2023-01-01', # 第1天'2023-02-14', # 情人节'2023-03-01', # 3月第1天'2023-12-31', # 年末'2024-12-31' # 闰年末
])# 获取一年中的天数
day_numbers = dates.dayofyearprint("日期列表:")
print(dates)
print("\n一年中的天数:")
print(day_numbers)
输出结果:
日期列表:
DatetimeIndex(['2023-01-01', '2023-02-14', '2023-03-01', '2023-12-31','2024-12-31'],dtype='datetime64[ns]', freq=None)一年中的天数:
[ 1 45 60 365 366]
示例2:与DataFrame结合使用
# 创建包含日期的DataFrame
df = pd.DataFrame({'event': ['元旦', '情人节', '三月开始', '年末', '闰年末'],'date': dates
})# 添加一年中的天数列
df['day_of_year'] = df['date'].dt.dayofyearprint("\n包含天数信息的DataFrame:")
print(df)
输出结果:
包含天数信息的DataFrame:event date day_of_year
0 元旦 2023-01-01 1
1 情人节 2023-02-14 45
2 三月开始 2023-03-01 60
3 年末 2023-12-31 365
4 闰年末 2024-12-31 366
示例3:分析一年中的数据分布
# 创建全年日期序列
year_dates = pd.date_range('2023-01-01', '2023-12-31', freq='D')
sales_data = pd.DataFrame({'date': year_dates,'sales': [100 + i%30 for i in range(len(year_dates))] # 模拟销售数据
})# 添加天数信息并计算每日平均销售额
sales_data['day_of_year'] = sales_data['date'].dt.dayofyear
daily_avg = sales_data.groupby('day_of_year')['sales'].mean()print("\n前5天的平均销售额:")
print(daily_avg.head())
print("\n最后5天的平均销售额:")
print(daily_avg.tail())
输出结果:
前5天的平均销售额:
day_of_year
1 100
2 101
3 102
4 103
5 104
Name: sales, dtype: int64最后5天的平均销售额:
day_of_year
361 125
362 126
363 127
364 128
365 129
Name: sales, dtype: int64
示例4:闰年处理
# 测试闰年日期
leap_dates = pd.DatetimeIndex(['2020-02-28', # 闰年2月28日'2020-02-29', # 闰日'2020-03-01', # 闰年后一天'2021-02-28', # 平年2月28日'2021-03-01' # 平年3月1日
])# 获取天数并创建DataFrame
leap_df = pd.DataFrame({'date': leap_dates,'day_of_year': leap_dates.dayofyear,'is_leap_year': leap_dates.is_leap_year
})print("\n闰年天数比较:")
print(leap_df)
输出结果:
闰年天数比较:date day_of_year is_leap_year
0 2020-02-28 59 True
1 2020-02-29 60 True
2 2020-03-01 61 True
3 2021-02-28 59 False
4 2021-03-01 60 False
示例5:可视化一年中的销售趋势
import matplotlib.pyplot as plt# 准备数据
sales_data.set_index('day_of_year', inplace=True)# 绘制全年销售趋势图
plt.figure(figsize=(12, 6))
sales_data['sales'].plot(title='2023年每日销售趋势')
plt.xlabel('一年中的天数')
plt.ylabel('销售额')
plt.grid(True)
plt.show()
输出结果: (将显示一个折线图,横轴为1-365天,纵轴为销售额)
注意事项
dayofyear
和day_of_year
是同一属性的两种写法,功能完全相同- 计算结果会自动考虑闰年情况,2月29日会被计算为第60天(闰年)
- 对于时间序列分析,这个属性特别适合用于:
- 发现季节性模式
- 分析年度周期变化
- 比较不同年份同期的数据
- 与
day
属性的区别:day
: 返回月份中的日期(1-31)dayofyear
: 返回一年中的天数(1-365/366)
这个属性在需要分析数据在一年中分布规律时非常有用,特别是在气象数据分析、销售季节性分析、年度报告生成等场景中。