目录
271、pandas.Series.dt.dayofyear属性
272、pandas.Series.dt.days_in_month属性
273、pandas.Series.dt.quarter属性
274、pandas.Series.dt.is_month_start属性
275、pandas.Series.dt.is_month_end属性
一、用法精讲
271、pandas.Series.dt.dayofyear属性
271-1、语法
python
# 271、pandas.Series.dt.dayofyear属性
pandas.Series.dt.dayofyear
The ordinal day of the year.
271-2、参数
无
271-3、功能
用于从日期时间序列中提取一年中的第几天,具备同样功能的还有pandas.Series.dt.day_of_year属性。
271-4、返回值
返回一个整数,表示一年中的序数日期,范围从1(1月1日)到365(或者在闰年中为366)。
271-5、说明
使用场景:
271-5-1、季节性分析:当你分析季节性趋势时,将日期转换为一年中的第几天有助于识别季节模式。比如,销售数据、气象数据和农业数据常常会受到季节性因素的影响。
271-5-2、时间序列分组:在进行时间序列数据分组时,例如按天数汇总数据,可以使用这个属性来将数据按年中的天数进行分组,便于进一步分析或可视化。
271-5-3、日期差异计算:在处理与日期相关的计算时,如计算两个日期之间的天数差异,使用这个属性可以帮助你将日期转换为易于比较的格式。
271-5-4、数据对齐和合并:当你需要将多个时间序列数据对齐或者合并时,使用这一属性可以帮助你在同一年中的相对位置对齐数据。
271-5-5、周期性特征工程:在机器学习建模时,将日期时间特征转换为一天中的第几天可以帮助模型学习周期性趋势,例如,预测天气或销售量。
271-6、用法
271-6-1、数据准备
python
无
271-6-2、代码示例
python
# 271、pandas.Series.dt.dayofyear属性
# 271-1、季节性分析
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
sales = np.random.rand(len(dates)) * 100
data = pd.DataFrame({'Date': dates, 'Sales': sales})
# 将日期转换为一年中的第几天
data['DayOfYear'] = data['Date'].dt.dayofyear
# 按天数汇总销售数据
daily_sales = data.groupby('DayOfYear')['Sales'].mean()
# 绘制季节性趋势图
plt.figure(figsize=(12, 6))
plt.plot(daily_sales.index, daily_sales.values)
plt.title('Seasonal Trend of Sales Data')
plt.xlabel('Day of Year')
plt.ylabel('Average Sales')
plt.grid(True)
plt.show()
# 271-2、时间序列分组
import pandas as pd
# 创建示例数据
dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
temperature = np.random.rand(len(dates)) * 30
data = pd.DataFrame({'Date': dates, 'Temperature': temperature})
# 将日期转换为一年中的第几天
data['DayOfYear'] = data['Date'].dt.dayofyear
# 按天数汇总温度数据
daily_avg_temp = data.groupby('DayOfYear')['Temperature'].mean()
print(daily_avg_temp.head(), end='\n\n')
# 271-3、日期差异计算
import pandas as pd
# 创建示例日期
date1 = pd.Timestamp('2024-03-01')
date2 = pd.Timestamp('2024-08-15')
# 计算日期差异
day_of_year1 = date1.dayofyear
day_of_year2 = date2.dayofyear
days_difference = abs(day_of_year2 - day_of_year1)
print(f'Days difference: {days_difference}', end='\n\n')
# 271-4、数据对齐和合并
import pandas as pd
import numpy as np
# 创建示例数据
dates1 = pd.date_range(start='2024-01-01', end='2024-06-30', freq='D')
data1 = pd.DataFrame({'Date': dates1, 'Value1': np.random.rand(len(dates1)) * 100})
dates2 = pd.date_range(start='2024-07-01', end='2024-12-31', freq='D')
data2 = pd.DataFrame({'Date': dates2, 'Value2': np.random.rand(len(dates2)) * 100})
# 将日期转换为一年中的第几天
data1['DayOfYear'] = data1['Date'].dt.dayofyear
data2['DayOfYear'] = data2['Date'].dt.dayofyear
# 合并数据
merged_data = pd.merge(data1[['DayOfYear', 'Value1']], data2[['DayOfYear', 'Value2']], on='DayOfYear', how='outer')
print(merged_data.head(), end='\n\n')
# 271-5、周期性特征工程
import pandas as pd
import numpy as np
# 创建示例数据
dates = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
sales = np.random.rand(len(dates)) * 100
data = pd.DataFrame({'Date': dates, 'Sales': sales})
# 将日期转换为一年中的第几天
data['DayOfYear'] = data['Date'].dt.dayofyear
# 将 DayOfYear 转换为周期性特征(例如正弦和余弦)
data['DayOfYear_Sin'] = np.sin(2 * np.pi * data['DayOfYear'] / 365)
data['DayOfYear_Cos'] = np.cos(2 * np.pi * data['DayOfYear'] / 365)
print(data[['Date', 'DayOfYear', 'DayOfYear_Sin', 'DayOfYear_Cos']].head())
271-6-3、结果输出
python
# 271、pandas.Series.dt.dayofyear属性
# 271-1、季节性分析
# 见图1
# 271-2、时间序列分组
# DayOfYear
# 1 4.654971
# 2 22.423349
# 3 16.145457
# 4 16.341184
# 5 23.362987
# Name: Temperature, dtype: float64
# 271-3、日期差异计算
# Days difference: 167
# 271-4、数据对齐和合并
# DayOfYear Value1 Value2
# 0 1 61.680196 NaN
# 1 2 40.421598 NaN
# 2 3 2.239969 NaN
# 3 4 17.233058 NaN
# 4 5 34.516007 NaN
# 271-5、周期性特征工程
# Date DayOfYear DayOfYear_Sin DayOfYear_Cos
# 0 2024-01-01 1 0.017213 0.999852
# 1 2024-01-02 2 0.034422 0.999407
# 2 2024-01-03 3 0.051620 0.998667
# 3 2024-01-04 4 0.068802 0.997630
# 4 2024-01-05 5 0.085965 0.996298
图1:
272、pandas.Series.dt.days_in_month属性
272-1、语法
python
# 272、pandas.Series.dt.days_in_month属性
pandas.Series.dt.days_in_month
The number of days in the month.
272-2、参数
无
272-3、功能
用于处理日期时间数据的属性,它能够返回每个日期所在月份的天数。
272-4、返回值
返回一个整数类型的Series,其中每个元素代表对应日期所在月份的天数。
272-5、说明
使用场景:
**272-5-1、财务分析:**在财务分析中,特别是在处理月度财务报表时,了解每个月的天数是很重要的。例如,计算每月的销售额时,知道每个月有多少天可以帮助计算日均销售额或调整财务预测模型。
**272-5-2、时间序列数据处理:**在处理时间序列数据时,某些统计计算可能需要考虑月份的天数。例如,计算某个月的平均气温或降水量时,需要调整数据以反映该月的实际天数。
**272-5-3、数据清理和验证:**在数据清理过程中,可能需要检查日期数据的一致性。比如,确保生成的时间序列数据不会错误地包含不符合月份天数的日期。
**272-5-4、统计分析:**在进行统计分析时,了解每个月的天数有助于进行更加精确的统计计算。比如,在计算每个月的事件发生频率时,知道每个月的天数可以帮助标准化数据。
**272-5-5、时间特征工程:**在构建机器学习模型时,将月份的天数作为特征之一,可能对模型性能产生积极的影响。例如,在预测能源消耗或交通流量时,每个月的天数可能会影响预测结果。
272-6、用法
272-6-1、数据准备
python
无
272-6-2、代码示例
python
# 272、pandas.Series.dt.days_in_month属性
# 272-1、财务分析
import pandas as pd
# 创建示例数据
data = {
'date': pd.date_range(start='2024-01-01', periods=90, freq='D'),
'sales': [100 + i for i in range(90)] # 假设每天的销售额逐渐增加
}
df = pd.DataFrame(data)
# 计算每个月的总销售额
df['month'] = df['date'].dt.to_period('M')
monthly_sales = df.groupby('month')['sales'].sum()
# 获取每个月的天数
days_in_month = df['date'].dt.days_in_month.groupby(df['date'].dt.to_period('M')).first()
# 计算日均销售额
daily_avg_sales = monthly_sales / days_in_month
print(daily_avg_sales, end='\n\n')
# 272-2、时间序列数据处理
import pandas as pd
import numpy as np
# 创建示例气温数据
np.random.seed(0)
dates = pd.date_range(start='2024-01-01', periods=90, freq='D')
temperatures = np.random.normal(loc=20, scale=5, size=len(dates)) # 随机生成气温数据
df = pd.DataFrame({'date': dates, 'temperature': temperatures})
# 计算每个月的总气温
df['month'] = df['date'].dt.to_period('M')
monthly_temp_sum = df.groupby('month')['temperature'].sum()
# 获取每个月的天数
days_in_month = df['date'].dt.days_in_month.groupby(df['date'].dt.to_period('M')).first()
# 计算月均气温
monthly_avg_temp = monthly_temp_sum / days_in_month
print(monthly_avg_temp, end='\n\n')
# 272-3、数据清理和验证
import pandas as pd
# 创建包含日期的示例数据
dates = pd.Series(pd.to_datetime(['2024-01-31', '2024-02-30', '2024-03-15', '2024-04-31'], errors='coerce'))
# 检查每个日期是否在该月有效
valid_dates = dates[dates.dt.day <= dates.dt.days_in_month]
# 打印有效日期
print("有效日期:")
print(valid_dates.dt.strftime('%Y-%m-%d'), end='\n\n')
# 272-4、统计分析
import pandas as pd
# 创建示例事件数据
data = {
'date': pd.date_range(start='2024-01-01', periods=90, freq='D'),
'event_occurred': np.random.choice([0, 1], size=90) # 随机事件发生(0或1)
}
df = pd.DataFrame(data)
# 计算每个月的事件发生总数
df['month'] = df['date'].dt.to_period('M')
monthly_event_count = df.groupby('month')['event_occurred'].sum()
# 获取每个月的天数
days_in_month = df['date'].dt.days_in_month.groupby(df['date'].dt.to_period('M')).first()
# 计算事件发生频率
event_frequency = monthly_event_count / days_in_month
print(event_frequency, end='\n\n')
# 272-5、时间特征工程
import pandas as pd
# 创建示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=90, freq='D'),
'feature_1': np.random.rand(90), # 随机特征
}
df = pd.DataFrame(data)
# 添加月份的天数作为特征
df['days_in_month'] = df['date'].dt.days_in_month
print(df.head())
272-6-3、结果输出
python
# 272、pandas.Series.dt.days_in_month属性
# 272-1、财务分析
# month
# 2024-01 115.000000
# 2024-02 145.000000
# 2024-03 168.870968
# Freq: M, dtype: float64
# 272-2、时间序列数据处理
# month
# 2024-01 22.167845
# 2024-02 18.475758
# 2024-03 18.707802
# Freq: M, dtype: float64
# 272-3、数据清理和验证
# 有效日期:
# 0 2024-01-31
# 2 2024-03-15
# dtype: object
# 272-4、统计分析
# month
# 2024-01 0.612903
# 2024-02 0.482759
# 2024-03 0.645161
# Freq: M, dtype: float64
# 272-5、时间特征工程
# date feature_1 days_in_month
# 0 2024-01-01 0.069167 31
# 1 2024-01-02 0.697429 31
# 2 2024-01-03 0.453543 31
# 3 2024-01-04 0.722056 31
# 4 2024-01-05 0.866382 31
273、pandas.Series.dt.quarter属性
273-1、语法
python
# 273、pandas.Series.dt.quarter属性
pandas.Series.dt.quarter
The quarter of the date.
273-2、参数
无
273-3、功能
用于从日期时间序列中提取每个日期所在的季度。
273-4、返回值
一个整数序列,每个整数表示对应日期的季度,具体来说:
- 1表示第一季度(1月到3月)
- 2表示第二季度(4月到6月)
- 3表示第三季度(7月到9月)
- 4表示第四季度(10月到12月)
273-5、说明
使用场景:
**273-5-1、财务分析:**企业通常按季度发布财务报告,使用该属性可以帮助分析不同季度的收入、支出和利润等数据,以便识别季节性趋势。
**273-5-2、销售数据分析:**零售商可以利用该属性来评估每个季度的销售表现,从而制定更有效的营销策略和库存管理计划。
**273-5-3、季节性趋势研究:**在经济学和社会学研究中,分析特定季度的数据(如消费者支出、旅游业活动等)可以帮助研究季节性变化的影响。
**273-5-4、预算和预测:**企业可以基于历史季度数据来制定预算和未来的财务预测,以便更好地规划资源分配。
**273-5-5、业绩评估:**公司可以通过比较不同季度的关键绩效指标(KPI)来评估业务的增长和表现。
**273-5-6、时间序列可视化:**在数据可视化中,将数据按季度分组可以使图表更加清晰,便于观察季度间的变化。
**273-5-7、数据聚合:**在处理大规模时间序列数据时,可以根据季度进行数据聚合,以便进行更高层次的分析,例如计算每个季度的平均值、总和等。
273-6、用法
273-6-1、数据准备
python
无
273-6-2、代码示例
python
# 273、pandas.Series.dt.quarter属性
# 273-1、财务分析
import pandas as pd
# 创建示例数据
data = {
'date': pd.date_range(start='2023-01-01', periods=12, freq='ME'),
'revenue': [1000, 1200, 1100, 1500, 1600, 1700, 1800, 2000, 2100, 2200, 2300, 2400]
}
df = pd.DataFrame(data)
# 添加季度列
df['quarter'] = df['date'].dt.quarter
# 按季度分组并计算总收入
quarterly_revenue = df.groupby('quarter')['revenue'].sum().reset_index()
print(quarterly_revenue, end='\n\n')
# 273-2、销售数据分析
import pandas as pd
# 创建示例数据
sales_data = {
'date': pd.date_range(start='2023-01-01', periods=12, freq='ME'),
'sales': [500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600]
}
sales_df = pd.DataFrame(sales_data)
# 添加季度列
sales_df['quarter'] = sales_df['date'].dt.quarter
# 按季度分组并计算总销售额
quarterly_sales = sales_df.groupby('quarter')['sales'].sum().reset_index()
print(quarterly_sales, end='\n\n')
# 273-3、季节性趋势研究
import pandas as pd
# 创建示例数据
consumer_spending = {
'date': pd.date_range(start='2023-01-01', periods=12, freq='ME'),
'spending': [300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850]
}
spending_df = pd.DataFrame(consumer_spending)
# 添加季度列
spending_df['quarter'] = spending_df['date'].dt.quarter
# 按季度分组并计算总消费支出
quarterly_spending = spending_df.groupby('quarter')['spending'].sum().reset_index()
print(quarterly_spending, end='\n\n')
# 273-4、预算和预测
import pandas as pd
# 创建示例数据
budget_data = {
'date': pd.date_range(start='2023-01-01', periods=12, freq='ME'),
'budget': [10000, 12000, 11000, 15000, 16000, 17000, 18000, 20000, 21000, 22000, 23000, 24000]
}
budget_df = pd.DataFrame(budget_data)
# 添加季度列
budget_df['quarter'] = budget_df['date'].dt.quarter
# 按季度分组并计算总预算
quarterly_budget = budget_df.groupby('quarter')['budget'].sum().reset_index()
print(quarterly_budget, end='\n\n')
# 273-5、数据聚合
import pandas as pd
# 创建示例数据
large_data = {
'date': pd.date_range(start='2023-01-01', periods=24, freq='ME'),
'value': range(24)
}
large_df = pd.DataFrame(large_data)
# 添加季度列
large_df['quarter'] = large_df['date'].dt.quarter
# 按季度分组并计算每个季度的平均值
quarterly_aggregate = large_df.groupby('quarter')['value'].mean().reset_index()
print(quarterly_aggregate, end='\n\n')
# 273-6、季度数据可视化
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
# 配置字体,确保中文字符正常显示
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 创建示例数据
data = {
'date': pd.date_range(start='2023-01-01', periods=12, freq='ME'),
'revenue': [1000, 1200, 1100, 1500, 1600, 1700, 1800, 2000, 2100, 2200, 2300, 2400]
}
df = pd.DataFrame(data)
# 添加季度列
df['quarter'] = df['date'].dt.quarter
# 按季度分组并计算总收入
quarterly_revenue = df.groupby('quarter')['revenue'].sum().reset_index()
# 可视化
plt.figure(figsize=(8, 5))
plt.bar(quarterly_revenue['quarter'], quarterly_revenue['revenue'], color='skyblue')
plt.xlabel('季度')
plt.ylabel('总收入')
plt.title('各季度总收入')
plt.xticks(quarterly_revenue['quarter'])
plt.show()
# 273-7、季度同比分析
import pandas as pd
# 创建示例数据(跨年度)
data = {
'date': pd.date_range(start='2022-01-01', periods=24, freq='ME'),
'revenue': [1000, 1200, 1100, 1500, 1600, 1700,
1800, 2000, 2100, 2200, 2300, 2400,
1300, 1400, 1350, 1550, 1650, 1750,
1850, 2050, 2150, 2250, 2350, 2450]
}
df = pd.DataFrame(data)
# 添加年份和季度列
df['year'] = df['date'].dt.year
df['quarter'] = df['date'].dt.quarter
# 按年份和季度分组并计算总收入
quarterly_revenue = df.groupby(['year', 'quarter'])['revenue'].sum().reset_index()
# 创建一个新的列来计算同比
quarterly_revenue['previous_year_revenue'] = quarterly_revenue.groupby('quarter')['revenue'].shift(1)
quarterly_revenue['year_on_year_growth'] = (quarterly_revenue['revenue'] - quarterly_revenue['previous_year_revenue']) / quarterly_revenue['previous_year_revenue'] * 100
print(quarterly_revenue, end='\n\n')
# 273-8、季度预测模型
import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np
# 创建示例数据(只使用过去的季度数据)
data = {
'date': pd.date_range(start='2023-01-01', periods=12, freq='ME'),
'revenue': [1000, 1200, 1100, 1500, 1600, 1700,
1800, 2000, 2100, 2200, 2300, 2400]
}
df = pd.DataFrame(data)
# 添加季度列
df['quarter'] = df['date'].dt.quarter
# 准备训练数据
X = np.array(df['quarter']).reshape(-1, 1) # 特征变量
y = np.array(df['revenue']) # 标签变量
# 创建线性回归模型并训练
model = LinearRegression()
model.fit(X, y)
# 预测未来4个季度的收入
future_quarters = np.array([1, 2, 3, 4]).reshape(-1, 1)
predicted_revenue = model.predict(future_quarters)
print("未来4个季度的预测收入:", [f"{revenue:.2f}" for revenue in predicted_revenue])
273-6-3、结果输出
python
# 273、pandas.Series.dt.quarter属性
# 273-1、财务分析
# quarter revenue
# 0 1 3300
# 1 2 4800
# 2 3 5900
# 3 4 6900
# 273-2、销售数据分析
# quarter sales
# 0 1 1800
# 1 2 2700
# 2 3 3600
# 3 4 4500
# 273-3、季节性趋势研究
# quarter spending
# 0 1 1050
# 1 2 1500
# 2 3 1950
# 3 4 2400
# 273-4、预算和预测
# quarter budget
# 0 1 33000
# 1 2 48000
# 2 3 59000
# 3 4 69000
# 273-5、数据聚合
# quarter value
# 0 1 7.0
# 1 2 10.0
# 2 3 13.0
# 3 4 16.0
# 273-6、季度数据可视化
# 见图2
# 273-7、季度同比分析
# year quarter revenue previous_year_revenue year_on_year_growth
# 0 2022 1 3300 NaN NaN
# 1 2022 2 4800 NaN NaN
# 2 2022 3 5900 NaN NaN
# 3 2022 4 6900 NaN NaN
# 4 2023 1 4050 3300.0 22.727273
# 5 2023 2 4950 4800.0 3.125000
# 6 2023 3 6050 5900.0 2.542373
# 7 2023 4 7050 6900.0 2.173913
# 273-8、季度预测模型
# 未来4个季度的预测收入: ['1146.67', '1543.33', '1940.00', '2336.67']
图2:
274、pandas.Series.dt.is_month_start属性
274-1、语法
python
# 274、pandas.Series.dt.is_month_start属性
pandas.Series.dt.is_month_start
Indicates whether the date is the first day of the month.
Returns:
Series or array
For Series, returns a Series with boolean values. For DatetimeIndex, returns a boolean array.
274-2、参数
无
274-3、功能
用于检查日期是否是每个月的第一天的属性。
274-4、返回值
返回一个布尔型的Series
,对于每个日期,如果该日期是一个月的第一天,则对应位置为True
,否则为False
。
274-5、说明
使用场景:
**274-5-1、财务报表分析:**在财务数据中,通常需要根据每个月的开始日期进行数据汇总或分析,使用该属性可以快速筛选出每个月的第一天,以便进行月度报表生成。
**274-5-2、时间序列数据处理:**在分析时间序列数据时,可能需要对每个月的第一天进行特定操作,例如计算每月的平均值或总和。
**274-5-3、事件触发:**如果系统中有基于日期触发的事件,比如每月第一天发送通知或执行某项任务,可以利用该属性来确定何时触发这些事件。
**274-5-4、数据清洗:**在处理数据集时,可能需要删除或标记不是每月第一天的数据,该属性可以帮助快速识别并进行相应的清理。
**274-5-5、可视化分析:**在制作时间序列图表时,标记每个月的第一天可以帮助更清晰地展示数据的变化趋势。
**274-5-6、生成周期性报告:**许多业务流程要求按月生成报告,使用该属性,可以轻松选择每个月的开始日期,以便从数据库中提取相应的数据。
274-6、用法
274-6-1、数据准备
python
无
274-6-2、代码示例
python
# 274、pandas.Series.dt.is_month_start属性
# 274-1、财务报表分析
import pandas as pd
# 创建一个示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'amount': range(60)
}
df = pd.DataFrame(data)
# 标记每个月的第一天
df['is_month_start'] = df['date'].dt.is_month_start
# 筛选出每个月的第一天数据
month_start_data = df[df['is_month_start']]
print(month_start_data, end='\n\n')
# 274-2、时间序列数据处理
import pandas as pd
# 创建一个示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'value': range(60)
}
df = pd.DataFrame(data)
# 标记每个月的第一天
df['is_month_start'] = df['date'].dt.is_month_start
# 筛选出每个月的第一天数据
month_start_df = df[df['is_month_start']]
# 计算每个月的平均值
monthly_avg = month_start_df.resample('ME', on='date').mean()
print(monthly_avg, end='\n\n')
# 274-3、事件触发
import pandas as pd
# 创建一个示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=60, freq='D')
}
df = pd.DataFrame(data)
# 标记每个月的第一天
df['is_month_start'] = df['date'].dt.is_month_start
# 触发事件的日期
events = df[df['is_month_start']]
for date in events['date']:
print(f"Trigger event on: {date}")
# 274-4、数据清洗
import pandas as pd
# 创建一个示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'value': range(60)
}
df = pd.DataFrame(data)
# 标记每个月的第一天
df['is_month_start'] = df['date'].dt.is_month_start
# 清理数据,只保留每个月第一天的数据
cleaned_df = df[df['is_month_start']]
print(cleaned_df, end='\n\n')
# 274-5、可视化分析
import pandas as pd
import matplotlib.pyplot as plt
# 创建一个示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'value': range(60)
}
df = pd.DataFrame(data)
# 标记每个月的第一天
df['is_month_start'] = df['date'].dt.is_month_start
# 绘制时间序列图
plt.figure(figsize=(12, 6))
plt.plot(df['date'], df['value'], label='Value')
plt.scatter(df[df['is_month_start']]['date'],
df[df['is_month_start']]['value'],
color='red',
label='Month Start',
marker='o')
plt.xlabel('Date')
plt.ylabel('Value')
plt.title('Time Series with Month Start Marked')
plt.legend()
plt.grid(True)
plt.show()
# 274-6、生成周期性报告
import pandas as pd
# 创建一个示例数据集
data = {
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'sales': range(60)
}
df = pd.DataFrame(data)
# 标记每个月的第一天
df['is_month_start'] = df['date'].dt.is_month_start
# 按月份生成报告
monthly_report = df[df['is_month_start']].set_index('date').resample('ME').sum()
print(monthly_report)
274-6-3、结果输出
python
# 274、pandas.Series.dt.is_month_start属性
# 274-1、财务报表分析
# date amount is_month_start
# 0 2024-01-01 0 True
# 31 2024-02-01 31 True
# 274-2、时间序列数据处理
# value is_month_start
# date
# 2024-01-31 0.0 1.0
# 2024-02-29 31.0 1.0
# 274-3、事件触发
# Trigger event on: 2024-01-01 00:00:00
# Trigger event on: 2024-02-01 00:00:00
# 274-4、数据清洗
# date value is_month_start
# 0 2024-01-01 0 True
# 31 2024-02-01 31 True
# 274-5、可视化分析
# 见图3
# 274-6、生成周期性报告
# sales is_month_start
# date
# 2024-01-31 0 1
# 2024-02-29 31 1
图3:
275、pandas.Series.dt.is_month_end属性
275-1、语法
python
# 275、pandas.Series.dt.is_month_end属性
pandas.Series.dt.is_month_end
Indicates whether the date is the last day of the month.
Returns:
Series or array
For Series, returns a Series with boolean values. For DatetimeIndex, returns a boolean array.
275-2、参数
无
275-3、功能
用于处理日期数据的属性,它可以判断每个日期是否是该月的最后一天。
275-4、返回值
返回一个布尔值Series,如果日期是月份的最后一天,则对应位置的值为True;否则为False。
275-5、说明
使用场景:
**275-5-1、数据筛选:**当我们需要从一个时间序列中提取每个月的最后一天时,该属性可以非常方便地实现这一点。例如,我们可能只想分析每个月最后一天的数据。
**275-5-2、统计分析:**很多业务场景需要在月末进行数据的统计和汇总,比如计算每个月最后一天的库存量、销售额等。
**275-5-3、数据可视化:**在数据可视化时,强调每个月的最后一天可以帮助更清晰地展示数据的变化趋势,可以使用该属性来标记图中的月末日期。
**275-5-4、数据校验:**在数据处理中,有时需要确保每个月的数据都有完整的月末记录,可以使用该属性来验证数据中是否缺少某个月的月末记录。
**275-5-5、财务报表分析:**在财务分析中,通常需要月末的数据进行结算和报告。例如,生成月末的资产负债表或损益表。
275-6、用法
275-6-1、数据准备
python
无
275-6-2、代码示例
python
# 275、pandas.Series.dt.is_month_end属性
# 275-1、数据筛选
import pandas as pd
# 创建一个包含日期的 Series
dates = pd.Series(pd.date_range(start='2024-01-01', periods=60, freq='D'))
# 筛选出每个月的最后一天
month_end_dates = dates[dates.dt.is_month_end]
print(month_end_dates, end='\n\n')
# 275-2、统计分析
import pandas as pd
import numpy as np
# 假设我们有一个包含销售数据的DataFrame
data = pd.DataFrame({
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'sales': np.random.randint(100, 200, size=60)
})
# 计算每个月最后一天的销售额
month_end_sales = data[data['date'].dt.is_month_end]
print(month_end_sales, end='\n\n')
# 275-3、数据可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 生成随机销售数据
data = pd.DataFrame({
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'sales': np.random.randint(100, 200, size=60)
})
# 标记每个月的最后一天
data['is_month_end'] = data['date'].dt.is_month_end
# 绘制时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data['date'], data['sales'], label='Daily Sales')
plt.scatter(data[data['is_month_end']]['date'], data[data['is_month_end']]['sales'], color='red', label='Month End Sales')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.title('Daily Sales with Month End Highlights')
plt.legend()
plt.show()
# 275-4、数据校验
import pandas as pd
# 创建一个日期范围
date_range = pd.date_range(start='2024-01-01', periods=60, freq='D')
# 检查每个月是否有月末记录
month_end_dates = date_range[date_range.is_month_end]
missing_month_end = pd.date_range(start='2024-01-01', periods=3, freq='ME').difference(month_end_dates)
print(f"缺少的月末日期: {missing_month_end}", end='\n\n')
# 275-5、财务报表分析
import pandas as pd
import numpy as np
# 假设我们有一个包含财务数据的DataFrame
financial_data = pd.DataFrame({
'date': pd.date_range(start='2024-01-01', periods=60, freq='D'),
'balance': np.random.randint(10000, 20000, size=60)
})
# 提取每个月的月末财务数据
month_end_financials = financial_data[financial_data['date'].dt.is_month_end]
print(month_end_financials)
275-6-3、结果输出
python
# 275、pandas.Series.dt.is_month_end属性
# 275-1、数据筛选
# 30 2024-01-31
# 59 2024-02-29
# dtype: datetime64[ns]
# 275-2、统计分析
# date sales
# 30 2024-01-31 127
# 59 2024-02-29 170
# 275-3、数据可视化
# 见图3
# 275-4、数据校验
# 缺少的月末日期: DatetimeIndex(['2024-03-31'], dtype='datetime64[ns]', freq='ME')
# 275-5、财务报表分析
# date balance
# 30 2024-01-31 13937
# 59 2024-02-29 19661
图4: