当前位置:   article > 正文

Python酷库之旅-第三方库Pandas(070)

Python酷库之旅-第三方库Pandas(070)

目录

一、用法精讲

281、pandas.Series.dt.daysinmonth属性

281-1、语法

281-2、参数

281-3、功能

281-4、返回值

281-5、说明

281-6、用法

281-6-1、数据准备

281-6-2、代码示例

281-6-3、结果输出

282、pandas.Series.dt.tz属性

282-1、语法

282-2、参数

282-3、功能

282-4、返回值

282-5、说明

282-6、用法

282-6-1、数据准备

282-6-2、代码示例

282-6-3、结果输出

283、pandas.Series.dt.freq属性

283-1、语法

283-2、参数

283-3、功能

283-4、返回值

283-5、说明

283-6、用法

283-6-1、数据准备

283-6-2、代码示例

283-6-3、结果输出

284、pandas.Series.dt.isocalendar属性

284-1、语法

284-2、参数

284-3、功能

284-4、返回值

284-5、说明

284-6、用法

284-6-1、数据准备

284-6-2、代码示例

284-6-3、结果输出

285、pandas.Series.dt.to_period方法

285-1、语法

285-2、参数

285-3、功能

285-4、返回值

285-5、说明

285-6、用法

285-6-1、数据准备

285-6-2、代码示例

285-6-3、结果输出

二、推荐阅读

1、Python筑基之旅

2、Python函数之旅

3、Python算法之旅

4、Python魔法之旅

5、博客个人主页

一、用法精讲

281、pandas.Series.dt.daysinmonth属性
281-1、语法
  1. # 281、pandas.Series.dt.daysinmonth属性
  2. pandas.Series.dt.daysinmonth
  3. The number of days in the month.
281-2、参数

        无

281-3、功能

        用于返回一个包含每个日期对应月份的天数的序列,这在时间序列分析中尤其有用,比如需要计算每个月的总天数时,或在处理日期数据时,需要知道某个月有多少天来进行一些特定的操作或分析,具备同样功能的还有pandas.Series.dt.days_in_month属性。

281-4、返回值

        返回每个时间戳所对应月份的天数,其返回值是一个包含每个时间戳所在月份天数的整数系列(Series)。

281-5、说明

        使用场景:

281-5-1、财务分析:确定每个月的天数对月末结算、预算编制和财务预测非常重要。例如,财务团队需要知道每个月的天数以便准确计算月度预算和实际开销。

281-5-2、数据完整性检查:在处理时间序列数据时,例如销售数据或传感器数据,可以使用daysinmonth确认每个月的数据是否完整,如果某个月的数据少于应有天数,可能需要进一步调查和处理。

281-5-3、平均日值计算:在数据分析中,经常需要将月度数据转换为平均日值。例如,在分析气象数据时,需要计算每月的平均日气温或降雨量。

281-5-4、时间序列转换:在某些情况下,可能需要将时间序列数据从月度转换为季度或年度数据,在这种转换过程中,需要知道每个月的天数以进行适当的加权计算。

281-5-5、资源规划和调度:在项目管理和资源规划中,了解每个月的天数可以帮助更好地进行资源分配和调度。例如,在人员管理中,根据每个月的天数合理分配工作量。

281-5-6、时间序列模拟:在模拟时间序列数据时,可以根据每个月的天数生成更为真实和合理的数据。例如,模拟每日销售数据时,可以根据每个月的天数生成月度数据。

281-5-7、时间序列分析:在进行季节性和周期性分析时,每个月的天数是一个重要的参考因素。例如,在分析股票市场的月度回报率时,可以考虑每个月的天数来计算加权平均值。

281-6、用法
281-6-1、数据准备
281-6-2、代码示例
  1. # 281、pandas.Series.dt.daysinmonth属性
  2. # 281-1、财务分析-月末结算和预算编制
  3. import pandas as pd
  4. # 创建一个日期序列
  5. date_series = pd.date_range(start='2023-01-01', end='2023-12-31', freq='MS')
  6. # 假设每个月的开销(单位:美元)
  7. monthly_expenses = pd.Series([3000, 2800, 3200, 3100, 2900, 2700, 3500, 3300, 3400, 3600, 3800, 3700], index=date_series)
  8. # 计算每月的天数
  9. days_in_month = date_series.daysinmonth
  10. # 计算每月的平均日开销
  11. daily_expenses = monthly_expenses / days_in_month
  12. print(daily_expenses, end='\n\n')
  13. # 281-2、数据完整性检查-验证数据完整性
  14. import pandas as pd
  15. # 假设一个日期序列和对应的数据
  16. date_series = pd.date_range(start='2023-01-01', end='2023-12-31')
  17. data = pd.Series(range(len(date_series)), index=date_series)
  18. # 计算每个月的数据点
  19. expected_days = date_series.to_series().dt.daysinmonth
  20. actual_days = data.groupby(data.index.month).size()
  21. # 检查是否有缺失的数据
  22. missing_data = expected_days - actual_days
  23. print(missing_data, end='\n\n')
  24. # 281-3、平均日值计算-计算每月的平均日气温
  25. import pandas as pd
  26. # 创建一个日期序列
  27. date_series = pd.date_range(start='2023-01-01', end='2023-12-31', freq='MS')
  28. # 假设每个月的平均气温(单位:摄氏度)
  29. monthly_temperature = pd.Series([2.5, 3.0, 5.5, 10.0, 15.0, 20.0, 25.0, 24.0, 20.0, 15.0, 8.0, 3.0], index=date_series)
  30. # 计算每月的天数
  31. days_in_month = date_series.daysinmonth
  32. # 计算每月的平均日气温
  33. average_daily_temperature = monthly_temperature / days_in_month
  34. print(average_daily_temperature, end='\n\n')
  35. # 281-4、时间序列转换-将月度数据转换为季度数据
  36. import pandas as pd
  37. # 创建一个日期序列
  38. date_series = pd.date_range(start='2023-01-01', end='2023-12-31', freq='ME')
  39. # 假设每个月的某项数据(单位:任意)
  40. monthly_data = pd.Series([100, 120, 110, 130, 140, 150, 160, 170, 180, 190, 200, 210], index=date_series)
  41. # 计算每月的天数
  42. days_in_month = date_series.daysinmonth
  43. # 将月度数据转换为季度数据
  44. quarterly_data = monthly_data.resample('QE').sum() / date_series.to_series().dt.daysinmonth.groupby(pd.Grouper(freq='QE')).sum()
  45. print(quarterly_data, end='\n\n')
  46. # 281-5、资源规划和调度-根据每个月的天数规划人力资源
  47. import pandas as pd
  48. # 创建一个日期序列
  49. date_series = pd.date_range(start='2023-01-01', end='2023-12-31', freq='ME')
  50. # 假设总工作量(单位:小时)
  51. total_workload = 1200
  52. # 创建一个包含日期的Series
  53. date_series = pd.Series(date_series)
  54. # 计算每月的天数
  55. days_in_month = date_series.dt.daysinmonth
  56. # 根据每个月的天数规划人力资源
  57. workload_per_day = total_workload / days_in_month.sum()
  58. print(workload_per_day, end='\n\n')
  59. # 281-6、时间序列模拟-生成模拟的每日销售数据
  60. import pandas as pd
  61. # 创建一个日期序列
  62. date_series = pd.date_range(start='2023-01-01', end='2023-12-31', freq='ME')
  63. # 假设每个月的销售数据(单位:任意)
  64. monthly_sales = pd.Series([3000, 3200, 3100, 3300, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100], index=date_series)
  65. # 计算每月的天数
  66. days_in_month = date_series.daysinmonth
  67. # 生成模拟的每日销售数据
  68. simulated_daily_sales = monthly_sales / days_in_month
  69. print(simulated_daily_sales, end='\n\n')
  70. # 281-7、时间序列分析-计算加权平均回报率
  71. import pandas as pd
  72. from pandas.tseries.offsets import MonthEnd
  73. # 创建一个日期序列,表示每个月的月末
  74. date_series = pd.date_range(start='2023-01-01', end='2023-12-31', freq=MonthEnd())
  75. # 假设每个月的回报率(单位:百分比),注意这里转换为小数形式
  76. monthly_return = pd.Series([0.02, 0.015, 0.025, 0.03, 0.028, 0.031, 0.029, 0.032, 0.035, 0.038, 0.04, 0.037],
  77. index=date_series)
  78. # 初始化一个列表来存储每个月的天数
  79. days_in_month = []
  80. # 计算每个月的天数
  81. for i in range(len(date_series) - 1):
  82. start_date = date_series[i]
  83. end_date = date_series[i + 1]
  84. # 由于freq='ME',end_date实际上是下个月的月末,所以我们用end_date - MonthEnd()来获取本月最后一天
  85. last_day_of_month = end_date - MonthEnd(1)
  86. # 计算这个月有多少天
  87. days_in_month.append((last_day_of_month - start_date).days + 1)
  88. # 转换为pandas Series以便进行索引和计算
  89. days_in_month = pd.Series(days_in_month, index=date_series[:-1]) # 去掉最后一个月末的日期,因为它不包含数据
  90. # 计算加权平均回报率
  91. # 注意:我们需要将days_in_month向前移动一个月,以便与monthly_return的索引对齐
  92. weighted_return = (monthly_return * days_in_month.shift(1)).sum() / days_in_month.sum()
  93. # 由于我们使用了shift(1),所以第一个月的回报率没有被计算在内(因为没有前一个月的天数)
  94. # 如果我们希望包含整个年份的回报率,我们可以选择忽略第一个月或者使用一个默认值
  95. # 但在这里,我们假设数据是从第二个月开始有效的,或者简单地忽略这个细节
  96. # 打印加权平均回报率
  97. print(weighted_return)
281-6-3、结果输出
  1. # 281、pandas.Series.dt.daysinmonth属性
  2. # 281-1、财务分析-月末结算和预算编制
  3. # 2023-01-01 96.774194
  4. # 2023-02-01 100.000000
  5. # 2023-03-01 103.225806
  6. # 2023-04-01 103.333333
  7. # 2023-05-01 93.548387
  8. # 2023-06-01 90.000000
  9. # 2023-07-01 112.903226
  10. # 2023-08-01 106.451613
  11. # 2023-09-01 113.333333
  12. # 2023-10-01 116.129032
  13. # 2023-11-01 126.666667
  14. # 2023-12-01 119.354839
  15. # Freq: MS, dtype: float64
  16. # 281-2、数据完整性检查-验证数据完整性
  17. # 2023-01-01 00:00:00 NaN
  18. # 2023-01-02 00:00:00 NaN
  19. # 2023-01-03 00:00:00 NaN
  20. # 2023-01-04 00:00:00 NaN
  21. # 2023-01-05 00:00:00 NaN
  22. # ..
  23. # 8 NaN
  24. # 9 NaN
  25. # 10 NaN
  26. # 11 NaN
  27. # 12 NaN
  28. # Length: 377, dtype: float64
  29. # 281-3、平均日值计算-计算每月的平均日气温
  30. # 2023-01-01 0.080645
  31. # 2023-02-01 0.107143
  32. # 2023-03-01 0.177419
  33. # 2023-04-01 0.333333
  34. # 2023-05-01 0.483871
  35. # 2023-06-01 0.666667
  36. # 2023-07-01 0.806452
  37. # 2023-08-01 0.774194
  38. # 2023-09-01 0.666667
  39. # 2023-10-01 0.483871
  40. # 2023-11-01 0.266667
  41. # 2023-12-01 0.096774
  42. # Freq: MS, dtype: float64
  43. # 281-4、时间序列转换-将月度数据转换为季度数据
  44. # 2023-03-31 3.666667
  45. # 2023-06-30 4.615385
  46. # 2023-09-30 5.543478
  47. # 2023-12-31 6.521739
  48. # Freq: QE-DEC, dtype: float64
  49. # 281-5、资源规划和调度-根据每个月的天数规划人力资源
  50. # 3.287671232876712
  51. # 281-6、时间序列模拟-生成模拟的每日销售数据
  52. # 2023-01-31 96.774194
  53. # 2023-02-28 114.285714
  54. # 2023-03-31 100.000000
  55. # 2023-04-30 110.000000
  56. # 2023-05-31 109.677419
  57. # 2023-06-30 116.666667
  58. # 2023-07-31 116.129032
  59. # 2023-08-31 119.354839
  60. # 2023-09-30 126.666667
  61. # 2023-10-31 125.806452
  62. # 2023-11-30 133.333333
  63. # 2023-12-31 132.258065
  64. # Freq: ME, dtype: float64
  65. # 281-7、时间序列分析-计算加权平均回报率
  66. # 0.027545454545454543
282、pandas.Series.dt.tz属性
282-1、语法
  1. # 282、pandas.Series.dt.tz属性
  2. pandas.Series.dt.tz
  3. Return the timezone.
  4. Returns:
  5. datetime.tzinfo, pytz.tzinfo.BaseTZInfo, dateutil.tz.tz.tzfile, or None
  6. Returns None when the array is tz-naive.
282-2、参数

        无

282-3、功能

        用于获取或设置pandas.Series对象中时间戳的时区信息。

282-4、返回值

        如果pandas.Series中的时间戳带有时区信息,则dt.tz返回pytz库中的tzinfo对象,表示时间戳的时区。例如,<UTC>表示协调世界时(UTC);如果pandas.Series中的时间戳没有时区信息,则dt.tz返回None。

282-5、说明

        无

282-6、用法
282-6-1、数据准备
282-6-2、代码示例
  1. # 282、pandas.Series.dt.tz属性
  2. import pandas as pd
  3. # 创建一个带有UTC时区的时间戳Series对象
  4. timestamps_with_tz = pd.Series(pd.date_range('2024-01-01', periods=3, freq='D', tz='UTC'))
  5. # 获取时区信息
  6. timezone_info = timestamps_with_tz.dt.tz
  7. print(timezone_info)
  8. # 创建一个没有时区的时间戳Series对象
  9. timestamps_no_tz = pd.Series(pd.date_range('2024-01-01', periods=3, freq='D'))
  10. # 获取时区信息
  11. timezone_info_no_tz = timestamps_no_tz.dt.tz
  12. print(timezone_info_no_tz)
282-6-3、结果输出
  1. # 282、pandas.Series.dt.tz属性
  2. # UTC
  3. # None
283、pandas.Series.dt.freq属性
283-1、语法
  1. # 283、pandas.Series.dt.freq属性
  2. pandas.Series.dt.freq
283-2、参数

        无

283-3、功能

        用于返回时间序列数据的频率信息,它提供了时间序列索引的频率属性,可以帮助你确定数据的时间间隔,这对于时间序列数据的处理和分析非常重要,特别是在需要进行频率转换、重采样或预测等操作时。

283-4、返回值

         返回一个pandas.tseries.offsets.DateOffset对象,代表时间序列的频率。如果时间序列不规则(即没有固定频率),则返回None。

283-5、说明

        使用场景:

283-5-1、频率检测与验证:

283-5-1-1、检测时间序列的规律性:在处理时间序列数据时,了解数据的频率有助于确定其是否规律。例如,检测数据是否为日频、月频等,以便选择合适的分析方法。

283-5-1-2、验证数据的完整性:通过检测频率,可以识别数据中是否存在缺失值或异常点。例如,日频数据中可能存在缺少某几天的数据,通过dt.freq可以帮助发现这些问题。

283-5-2、重采样操作:

283-5-2-1、频率转换:在重采样操作中,需要将数据从一种频率转换为另一种频率,例如从日频转换为月频,dt.freq可以帮助确定当前数据的频率,从而选择合适的重采样规则。

283-5-2-2、聚合与降采样:在降采样时(例如,从分钟频率降到小时频率),了解原始数据的频率有助于正确地聚合数据。

283-5-3、时间序列的绘图:在时间序列的可视化中,频率信息可以帮助设置合适的时间刻度,使得图表更加清晰易读。例如,在月频数据的图表中,可以设置每个月为一个刻度。

283-5-4、异常检测:当时间序列数据不规则时,dt.freq会返回None,这种情况下,可以进一步分析数据的异常点或缺失值。

283-6、用法
283-6-1、数据准备
283-6-2、代码示例
  1. # 283、pandas.Series.dt.freq属性
  2. # 283-1、检测频率与验证数据完整性
  3. import pandas as pd
  4. # 创建一个日频率的时间序列数据
  5. date_range = pd.date_range(start='2024-01-01', periods=10, freq='D')
  6. data = pd.Series(range(10), index=date_range)
  7. print("时间序列的频率:", data.index.freq)
  8. # 检查是否有缺失日期
  9. expected_dates = pd.date_range(start='2024-01-01', end='2024-01-10', freq='D')
  10. missing_dates = expected_dates.difference(data.index)
  11. if len(missing_dates) > 0:
  12. print("缺失的日期:", missing_dates)
  13. else:
  14. print("没有缺失的日期", end='\n\n')
  15. # 283-2、重采样操作
  16. import pandas as pd
  17. # 创建一个小时频率的时间序列数据
  18. hourly_range = pd.date_range(start='2024-01-01', periods=24, freq='h')
  19. hourly_data = pd.Series(range(24), index=hourly_range)
  20. print("原始数据的频率:", hourly_data.index.freq)
  21. # 将小时频率的数据重采样为日频
  22. daily_data = hourly_data.resample('D').sum()
  23. print("重采样后的频率:", daily_data.index.freq)
  24. print(daily_data, end='\n\n')
  25. # 283-3、时间序列的绘图
  26. import pandas as pd
  27. import matplotlib.pyplot as plt
  28. import matplotlib
  29. # 配置字体,确保中文字符正常显示
  30. matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
  31. # 创建一个月频率的时间序列数据
  32. date_range = pd.date_range(start='2023-01-01', periods=12, freq='ME')
  33. data = pd.Series(range(12), index=date_range)
  34. print("时间序列的频率:", data.index.freq)
  35. # 绘制时间序列图
  36. plt.figure(figsize=(10, 5))
  37. plt.plot(data.index, data, marker='o')
  38. plt.title('时间序列图')
  39. plt.xlabel('日期')
  40. plt.ylabel('值')
  41. plt.grid(True)
  42. plt.show()
  43. # 283-4、异常检测
  44. import pandas as pd
  45. # 创建一个不规则的时间序列数据
  46. irregular_range = pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-04'])
  47. irregular_data = pd.Series([1, 2, 3], index=irregular_range)
  48. print("不规则时间序列的频率:", irregular_data.index.freq)
  49. # 检查不规则时间序列的缺失日期
  50. expected_dates = pd.date_range(start='2024-01-01', end='2024-01-04', freq='D')
  51. missing_dates = expected_dates.difference(irregular_data.index)
  52. if len(missing_dates) > 0:
  53. print("缺失的日期:", missing_dates)
  54. else:
  55. print("没有缺失的日期")
283-6-3、结果输出
  1. # 283、pandas.Series.dt.freq属性
  2. # 283-1、检测频率与验证数据完整性
  3. # 时间序列的频率: <Day>
  4. # 没有缺失的日期
  5. # 283-2、重采样操作
  6. # 原始数据的频率: <Hour>
  7. # 重采样后的频率: <Day>
  8. # 2024-01-01 276
  9. # Freq: D, dtype: int64
  10. # 283-3、时间序列的绘图
  11. # 见图1
  12. # 283-4、异常检测
  13. # 时间序列的频率: <MonthEnd>
  14. # 不规则时间序列的频率: None
  15. # 缺失的日期: DatetimeIndex(['2024-01-03'], dtype='datetime64[ns]', freq='D')

图1:

 

284、pandas.Series.dt.isocalendar属性
284-1、语法
  1. # 284、pandas.Series.dt.isocalendar属性
  2. pandas.Series.dt.isocalendar()
  3. Calculate year, week, and day according to the ISO 8601 standard.
  4. Returns:
  5. DataFrame
  6. With columns year, week and day.
284-2、参数

        无

284-3、功能

        可以从日期时间对象中提取ISO年、ISO周和ISO星期几的信息。

284-4、返回值

        返回一个DataFrame,其中包含三列:year、week和day。

284-5、说明

        使用场景:

284-5-1、财务分析:在财务分析中,经常需要基于周、月或季度来汇总数据,使用ISO周数可以确保所有数据按照一致的周次进行汇总和分析。例如,比较每周的销售数据,分析季节性趋势。

284-5-2、周报和计划安排:ISO周数用于生成周报,确保每个报告周期的数据准确,特别是在计划和项目管理中。例如,生成项目进度周报、员工工作计划。

284-5-3、周期性数据分析:在时间序列分析中,识别和分析周期性趋势或季节性波动是常见任务,使用ISO周数有助于准确定位每周的数据点。例如,分析周度流量、评估季节性商品销售。

284-5-4、数据清理和对齐:在处理来自不同时间区域的数据时,使用ISO日历可以帮助标准化日期,以便更好地合并和对齐数据。例如,合并不同来源的时间序列数据。

284-5-5、国际化业务:ISO周数在国际化业务中尤其重要,因为它避免了由于不同地区采用不同的周定义(如周一或周日为一周开始)而产生的日期混淆。例如,跨国公司的全球报告系统。

284-6、用法
284-6-1、数据准备
284-6-2、代码示例
  1. # 284、pandas.Series.dt.isocalendar属性
  2. # 284-1、财务分析
  3. import pandas as pd
  4. # 创建一个销售数据DataFrame
  5. data = {
  6. 'date': pd.date_range('2024-07-01', periods=10, freq='D'),
  7. 'sales': [100, 150, 200, 250, 300, 350, 400, 450, 500, 550]
  8. }
  9. df = pd.DataFrame(data)
  10. # 提取ISO年和周数
  11. df['iso_year'] = df['date'].dt.isocalendar().year
  12. df['iso_week'] = df['date'].dt.isocalendar().week
  13. # 按ISO周汇总销售数据
  14. weekly_sales = df.groupby(['iso_year', 'iso_week'])['sales'].sum().reset_index()
  15. print(weekly_sales, end='\n\n')
  16. # 284-2、周报和计划安排
  17. import pandas as pd
  18. # 创建一个项目进度DataFrame
  19. data = {
  20. 'task': ['Task A', 'Task B', 'Task C', 'Task D'],
  21. 'start_date': pd.to_datetime(['2024-01-02', '2024-01-05', '2024-01-08', '2024-01-11']),
  22. 'end_date': pd.to_datetime(['2024-01-06', '2024-01-09', '2024-01-12', '2024-01-15'])
  23. }
  24. df = pd.DataFrame(data)
  25. # 提取ISO年和周数
  26. df['start_week'] = df['start_date'].dt.isocalendar().week
  27. df['end_week'] = df['end_date'].dt.isocalendar().week
  28. # 输出结果
  29. print(df, end='\n\n')
  30. # 284-3、周期性数据分析
  31. import pandas as pd
  32. import matplotlib.pyplot as plt
  33. # 创建一个流量数据 DataFrame
  34. data = {
  35. 'date': pd.date_range('2024-07-01', periods=30, freq='D'),
  36. 'traffic': [500, 600, 700, 800, 900, 1000, 1100,
  37. 1200, 1300, 1400, 1500, 1600, 1700, 1800,
  38. 1900, 2000, 2100, 2200, 2300, 2400, 2500,
  39. 2600, 2700, 2800, 2900, 3000, 3100, 3200,
  40. 3300, 3400]
  41. }
  42. df = pd.DataFrame(data)
  43. # 提取ISO周数
  44. df['iso_week'] = df['date'].dt.isocalendar().week
  45. # 按周汇总流量数据
  46. weekly_traffic = df.groupby('iso_week')['traffic'].sum()
  47. # 绘制流量趋势图
  48. plt.plot(weekly_traffic.index, weekly_traffic.values)
  49. plt.xlabel('ISO Week')
  50. plt.ylabel('Traffic')
  51. plt.title('Weekly Traffic Analysis')
  52. plt.grid(True)
  53. plt.show()
  54. # 284-4、数据清理和对齐
  55. import pandas as pd
  56. # 创建两个来源的数据
  57. data1 = {
  58. 'date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03']),
  59. 'value': [10, 20, 30]
  60. }
  61. data2 = {
  62. 'date': pd.to_datetime(['2024-01-04', '2024-01-05', '2024-01-06']),
  63. 'value': [40, 50, 60]
  64. }
  65. df1 = pd.DataFrame(data1)
  66. df2 = pd.DataFrame(data2)
  67. # 提取ISO年和周数
  68. df1['iso_week'] = df1['date'].dt.isocalendar().week
  69. df2['iso_week'] = df2['date'].dt.isocalendar().week
  70. # 合并数据
  71. merged_data = pd.concat([df1, df2]).reset_index(drop=True)
  72. # 输出结果
  73. print(merged_data, end='\n\n')
  74. # 284-5、国际化业务
  75. import pandas as pd
  76. # 创建一个国际化日期数据DataFrame
  77. data = {
  78. 'region': ['US', 'EU', 'Asia'],
  79. 'date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03'])
  80. }
  81. df = pd.DataFrame(data)
  82. # 提取 ISO 年和周数
  83. df['iso_week'] = df['date'].dt.isocalendar().week
  84. # 输出结果
  85. print(df)
284-6-3、结果输出
  1. # 284、pandas.Series.dt.isocalendar属性
  2. # 284-1、财务分析
  3. # iso_year iso_week sales
  4. # 0 2024 27 1750
  5. # 1 2024 28 1500
  6. # 284-2、周报和计划安排
  7. # task start_date end_date start_week end_week
  8. # 0 Task A 2024-01-02 2024-01-06 1 1
  9. # 1 Task B 2024-01-05 2024-01-09 1 2
  10. # 2 Task C 2024-01-08 2024-01-12 2 2
  11. # 3 Task D 2024-01-11 2024-01-15 2 3
  12. # 284-3、周期性数据分析
  13. # 见图2
  14. # 284-4、数据清理和对齐
  15. # date value iso_week
  16. # 0 2024-01-01 10 1
  17. # 1 2024-01-02 20 1
  18. # 2 2024-01-03 30 1
  19. # 3 2024-01-04 40 1
  20. # 4 2024-01-05 50 1
  21. # 5 2024-01-06 60 1
  22. # 284-5、国际化业务
  23. # region date iso_week
  24. # 0 US 2024-01-01 1
  25. # 1 EU 2024-01-02 1
  26. # 2 Asia 2024-01-03 1

图2:

 

285、pandas.Series.dt.to_period方法
285-1、语法
  1. # 285、pandas.Series.dt.to_period方法
  2. pandas.Series.dt.to_period(*args, **kwargs)
  3. Cast to PeriodArray/PeriodIndex at a particular frequency.
  4. Converts DatetimeArray/Index to PeriodArray/PeriodIndex.
  5. Parameters:
  6. freq
  7. str or Period, optional
  8. One of pandas’ period aliases or an Period object. Will be inferred by default.
  9. Returns:
  10. PeriodArray/PeriodIndex
  11. Raises:
  12. ValueError
  13. When converting a DatetimeArray/Index with non-regular values, so that a frequency cannot be inferred.
285-2、参数

285-2-1、*args(可选)其他位置参数,为后续扩展功能做预留。

285-2-2、**kwargs(可选)其他关键字参数,为后续扩展功能做预留。

285-3、功能

        将Series对象中的日期时间数据转换为周期数据,这对于时间序列分析非常有用,例如,按月、按季度或按年汇总数据;通过指定不同的频率,可以将日期时间数据转换为不同的周期类型。

285-4、返回值

        返回一个新的Series对象,其中包含Period对象,Period是一个表示时间段的对象,例如一个月、一季度或一年等。

285-5、说明

        使用场景:

285-5-1、数据汇总:将高频数据(如每日数据)汇总到较低频率的数据(如月度、季度或年度),以便于统计分析和报告。例如,将每日销售数据汇总为月度销售数据;将每小时的温度记录汇总为每月的平均温度。

285-5-2、时间序列分析:按不同周期对数据进行分析,观察和比较不同周期的趋势和变化。例如,比较不同季度的销售额增长趋势;分析年度的气候变化模式。

285-5-3、数据对齐:在处理多个时间序列时,确保数据对齐到同一周期,以便进行进一步的比较和分析。例如,将两个不同频率的时间序列(如每日和每周数据)对齐到同一周期(如每月)。

285-5-4、绘制周期图表:将时间序列数据按指定周期进行绘制,以便更直观地展示数据趋势和变化。例如,绘制每月的销售额变化图;绘制每季度的气温变化图。

285-5-5、数据过滤:按指定周期过滤数据,以便仅分析和处理特定时间段的数据。例如,过滤出特定月份的数据;只处理特定年份的数据。

285-6、用法
285-6-1、数据准备
285-6-2、代码示例
  1. # 285、pandas.Series.dt.to_period方法
  2. # 285-1、数据汇总
  3. import pandas as pd
  4. # 创建包含每日销售数据的Series
  5. date_series = pd.Series([100, 200, 150, 300, 250], index=pd.date_range("2024-01-01", periods=5, freq="D"))
  6. # 转换为月度周期
  7. period_series_month = date_series.resample('ME').sum()
  8. print(period_series_month, end='\n\n')
  9. # 285-2、时间序列分析
  10. import pandas as pd
  11. # 创建包含每日销售数据的Series
  12. date_series = pd.Series([100, 200, 150, 300, 250, 400, 350, 450, 500, 600], index=pd.date_range("2024-01-01", periods=10, freq="D"))
  13. # 转换为季度周期
  14. period_series_quarter = date_series.to_period('Q').groupby(level=0).sum()
  15. print(period_series_quarter, end='\n\n')
  16. # 285-3、数据对齐
  17. import pandas as pd
  18. # 创建包含每日销售数据的Series
  19. date_series_daily = pd.Series([100, 200, 150, 300, 250], index=pd.date_range("2024-01-01", periods=5, freq="D"))
  20. # 创建包含每周销售数据的Series
  21. date_series_weekly = pd.Series([700, 800], index=pd.date_range("2024-01-01", periods=2, freq="W"))
  22. # 转换为月度周期并对齐
  23. period_series_daily_month = date_series_daily.to_period('M').groupby(level=0).sum()
  24. period_series_weekly_month = date_series_weekly.to_period('M').groupby(level=0).sum()
  25. aligned_series = period_series_daily_month.add(period_series_weekly_month, fill_value=0)
  26. print(aligned_series, end='\n\n')
  27. # 285-4、绘制周期图表
  28. import matplotlib.pyplot as plt
  29. # 创建包含每日销售数据的Series
  30. date_series = pd.Series([100, 200, 150, 300, 250, 400, 350, 450, 500, 600], index=pd.date_range("2024-01-01", periods=10, freq="D"))
  31. # 转换为月度周期
  32. period_series_month = date_series.to_period('M').groupby(level=0).sum()
  33. # 绘制图表
  34. period_series_month.plot(kind='bar')
  35. plt.title('Monthly Sales')
  36. plt.xlabel('Month')
  37. plt.ylabel('Sales')
  38. plt.show()
  39. # 285-5、数据过滤
  40. import pandas as pd
  41. # 创建包含每日销售数据的Series
  42. date_series = pd.Series([100, 200, 150, 300, 250, 400, 350, 450, 500, 600], index=pd.date_range("2024-01-01", periods=10, freq="D"))
  43. # 转换为月度周期
  44. period_series_month = date_series.to_period('M')
  45. # 过滤出2024年1月份的数据
  46. filtered_series = period_series_month[period_series_month.index == '2024-01']
  47. print(filtered_series)
285-6-3、结果输出
  1. # 285、pandas.Series.dt.to_period方法
  2. # 285-1、数据汇总
  3. # 2024-01-31 1000
  4. # Freq: ME, dtype: int64
  5. # 285-2、时间序列分析
  6. # 2024Q1 3300
  7. # Freq: Q-DEC, dtype: int64
  8. # 285-3、数据对齐
  9. # 2024-01 2500
  10. # Freq: M, dtype: int64
  11. # 285-4、绘制周期图表
  12. # 见图3
  13. # 285-5、数据过滤
  14. # 2024-01 100
  15. # 2024-01 200
  16. # 2024-01 150
  17. # 2024-01 300
  18. # 2024-01 250
  19. # 2024-01 400
  20. # 2024-01 350
  21. # 2024-01 450
  22. # 2024-01 500
  23. # 2024-01 600
  24. # Freq: M, dtype: int64

图3:

 

二、推荐阅读

1、Python筑基之旅
2、Python函数之旅
3、Python算法之旅
4、Python魔法之旅
5、博客个人主页
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/956588
推荐阅读
相关标签
  

闽ICP备14008679号