1、date_range()

  1. 生成日期序列
  2. pandas.date_range(start=None, end=None, periods=None, freq=None, closed=None)
  3. 常见参数:
  4. start:开始日期
  5. end:结束日期
  6. periods:日期数量。 若同时指定start,end,periods,则会生成指定数量的时间间隔相同的日期
  7. closed:指定区间的开闭,默认是None,包含startend (left,right)
  8. freq:日期的频率,默认是'D'即天,常见还有M(月、显示xxxx-xx-31每月的最后一天) 如下图
  9. 还可以数字与其组合,如5D就是时间间隔为5
freq= 说明
A/ Y year年 每年的最后一天
AS/YS AS/YS 每年的第一天
M month 每月的最后一天
MS 每月的第一天
D day 每天
Q quarter 每季度的最后一天
QS 每季度的第一天
H
T/min
S
  1. import pandas as pd
  2. # 1、period指定日期数量,日期间隔相同 如结果有6个日期,且间隔为12日
  3. pd.date_range(start='2022-04-01',end='2022-05-31',periods=6)
  4. 输出:
  5. DatetimeIndex(['2022-04-01', '2022-04-13', '2022-04-25', '2022-05-07',
  6. '2022-05-19', '2022-05-31'],
  7. dtype='datetime64[ns]', freq=None)
  8. # 2、freq类似指定日期格式:freq='D'表示日期格式为xxxx-xx-xx 具体到日
  9. pd.date_range(start='2022-04-01',end='2022-04-11',freq='D')
  10. 输出:
  11. DatetimeIndex(['2022-04-01', '2022-04-02', '2022-04-03', '2022-04-04',
  12. '2022-04-05', '2022-04-06', '2022-04-07', '2022-04-08',
  13. '2022-04-09', '2022-04-10', '2022-04-11'],
  14. dtype='datetime64[ns]', freq='D')
  15. # 3、freq还可以赋值数字+字母:表示间隔为几个单位,如freq='2D' 表示间隔2日
  16. pd.date_range(start='2022-04-01',end='2022-04-11',freq='2D')
  17. 输出:
  18. DatetimeIndex(['2022-04-01', '2022-04-03', '2022-04-05', '2022-04-07',
  19. '2022-04-09', '2022-04-11'],
  20. dtype='datetime64[ns]', freq='2D')
  21. # 4、closed表示日期是否包含左右边界日期;如下语句,包含右边日期,但不包含左边日期,结果显示也没有2022-04-01的
  22. pd.date_range(start='2022-04-01',end='2022-04-11',freq='2D',closed='right')
  23. 输出:
  24. DatetimeIndex(['2022-04-03', '2022-04-05', '2022-04-07', '2022-04-09',
  25. '2022-04-11'],
  26. dtype='datetime64[ns]', freq='2D')
  27. # 5、freq='M' 表示以月为最小单位 显示的是每月最后一天
  28. pd.date_range(start='2022-04-01',end='2022-05-31',freq='M')
  29. 输出:
  30. DatetimeIndex(['2022-04-30', '2022-05-31'], dtype='datetime64[ns]', freq='M')
  31. # 5.2、如果不想要最后的日,可以利用to_period('M')将其不显示
  32. pd.date_range(start='2022-04-01',end='2022-05-31',freq='M').to_period('M')
  33. 输出:
  34. PeriodIndex(['2022-04', '2022-05'], dtype='period[M]', freq='M')
  35. # 6、freq='QS' 季度的第一天
  36. pd.date_range(start='2022-01-01',end='2022-12-31',freq='QS')
  37. 输出:
  38. DatetimeIndex(['2022-01-01', '2022-04-01', '2022-07-01', '2022-10-01'], dtype='datetime64[ns]', freq='QS-JAN')
  39. # 9、freq='H' 时 start='2022-04-01',end='2022-04-02' 表示的只是1号的24小时
  40. pd.date_range(start='2022-04-01',end='2022-04-02',freq='6H')
  41. 输出:
  42. DatetimeIndex(['2022-04-01 00:00:00', '2022-04-01 06:00:00',
  43. '2022-04-01 12:00:00', '2022-04-01 18:00:00',
  44. '2022-04-02 00:00:00'],
  45. dtype='datetime64[ns]', freq='6H')
  46. pd.date_range(start='2022-04-01',end='2022-04-02',freq='6H',closed='right')
  47. 输出: 左开右闭 指的是不包含2022-04-01 00:00:00 包含2022-04-02 00:00:00
  48. DatetimeIndex(['2022-04-01 06:00:00', '2022-04-01 12:00:00',
  49. '2022-04-01 18:00:00', '2022-04-02 00:00:00'],
  50. dtype='datetime64[ns]', freq='6H')

2、resample()

重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。
用这个方法之前需将日期作为索引并转化为日期型索引

DataFrame.resample(rule,label=None).sum()等函数 两个指标足以
rule : 重构规则(‘M’、’2D’等上图所示)
label:指定,我们使用哪一个作为新的label 区间的左还是右 默认左

  1. np.random.seed(20) #保证每次生成的随机数都一样
  2. dt = pd.date_range(start='2022-01-01',end='2022-04-30',freq='D')
  3. num = np.random.randint(100,200,120)
  4. df = pd.DataFrame(num,index=dt,columns=['num'])
  5. df.index # 看看索引类型 DatetimeIndex 日期型索引
  6. DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04',
  7. '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08',
  8. '2022-01-09', '2022-01-10',
  9. ...
  10. '2022-04-21', '2022-04-22', '2022-04-23', '2022-04-24',
  11. '2022-04-25', '2022-04-26', '2022-04-27', '2022-04-28',
  12. '2022-04-29', '2022-04-30'],
  13. dtype='datetime64[ns]', length=120, freq='D')
  14. # 将日期索引重新采样为 每月的第一天为一组 进行求和
  15. df.resample('MS').sum()
  16. num
  17. 2022-01-01 4647
  18. 2022-02-01 4181
  19. 2022-03-01 4505
  20. 2022-04-01 4489
  21. # 不显示日期后的日
  22. df.resample('M').sum().to_period('M')
  23. num
  24. 2022-01 4647
  25. 2022-02 4181
  26. 2022-03 4505
  27. 2022-04 4489
  28. # 按季度分组求和
  29. df.resample('Q').sum()
  30. num
  31. 2022-03-31 13333
  32. 2022-06-30 4489
  33. # .to_period('Q') 按季度显示 格式xxxxQn xxxx年Qn季度
  34. df.resample('Q').sum().to_period('Q')
  35. num
  36. 2022Q1 13333
  37. 2022Q2 4489

3、to_period()

to_period(‘’)描述的是该日期处于那个时期
例如to_period(‘M’) 将日期以月为单位即 xxxx-xx 某天处于某个月分

  1. # 生成日期
  2. dt = pd.date_range(start='2021-04-01',end='2023-04-30',freq='100D')
  3. DatetimeIndex(['2021-04-01', '2021-07-10', '2021-10-18', '2022-01-26',
  4. '2022-05-06', '2022-08-14', '2022-11-22', '2023-03-02'],
  5. dtype='datetime64[ns]', freq='100D')
  6. # 处于某年
  7. dt.to_period('Y')
  8. PeriodIndex(['2021', '2021', '2021', '2022', '2022', '2022', '2022', '2023'], dtype='period[A-DEC]', freq='A-DEC')
  9. # 处于某月
  10. dt.to_period('M')
  11. PeriodIndex(['2021-04', '2021-07', '2021-10', '2022-01', '2022-05', '2022-08',
  12. '2022-11', '2023-03'],
  13. dtype='period[M]', freq='M')
  14. # 处于某个季度
  15. dt.to_period('Q')
  16. PeriodIndex(['2021Q2', '2021Q3', '2021Q4', '2022Q1', '2022Q2', '2022Q3',
  17. '2022Q4', '2023Q1'],
  18. dtype='period[Q-DEC]', freq='Q-DEC')

参考资料:https://blog.csdn.net/m0_69435474/article/details/124339573

4、年月日列转换为相应的季度值

以实际需求-将DataFrame的日期列转换为相应的季度来举例,处理过程为先将日期列和有唯一值的列(这里是id列值唯一)单独取出,然后将日期列设置为index,之后使用to_period(‘Q’)将index转换为季度,然后再使用reset_index()将index变换为DataFrame的一列数据。

  1. # 日期列data_account_created与唯一值列id
  2. increase_user_data = all_users.loc[:,['date_account_created','id']]
  3. aa = increase_user_data.copy()
  4. # 将日期列设置为index
  5. aa.set_index(['date_account_created'], inplace=True)
  6. # 将index值为日期转化为index值为季度
  7. aa = aa.to_period("Q")
  8. # 将季度信息写入DataFrame数据
  9. aa.reset_index(drop=False,inplace=True)
  10. # 列名重命名
  11. aa.rename(columns={'date_account_created':'Q_create_time'},inplace=True)
  12. # 写回原表
  13. increase_user_data = pd.merge(increase_user_data,aa)
  14. increase_user_data.head()

image.png

5、pd.to_datetime(df[‘time’],dayfirst=True)

将DataFrame里的时间数据转换为时间格式,但是要注意dayfirst参数的设置。

  1. print(pd.to_datetime('12-11-2017'))
  2. print(pd.to_datetime('12-11-2017', dayfirst = True))# 日在前 =
  3. print(pd.to_datetime('07-11-2017'))
  4. print(pd.to_datetime('07-11-2017', dayfirst = False))# 日在后 =

image.png