当前位置:   article > 正文

pandas—日期时间_pandas获取当前时间

pandas获取当前时间

1 datetime对象

1.1 获取创建时间

  1. from datetime import datetime
  2. #获取当前的日期和时间
  3. t1 = datetime.now()
  4. print(t1)
  5. #时间类型是datetime
  6. print(type(t1))
  7. #手动创建datetime
  8. t2 = datetime(1970,1,1,23,23)
  9. print(t2)
  10. print(type(t2))
  11. tt = t1-t2
  12. print(tt)
  13. #运算结果的数据类型为timedelta
  14. print(type(tt))
  15. '''
  16. 2023-05-10 17:16:53.032930
  17. <class 'datetime.datetime'>
  18. 1970-01-01 23:23:00
  19. <class 'datetime.datetime'>
  20. 19486 days, 17:53:53.032930
  21. <class 'datetime.timedelta'>
  22. '''

1.2 转换成datetime类型

调用 to_datetime方法 把旧列转换为 datetime类型 赋给新列

参数 format='%m/%d/%Y' 手动指定日期格式

参数 dayfirst=True ,yearfirst=True 设置日期格式以 日或年 开始

  1. import pandas as pd
  2. df = pd.read_csv('.../country_timeseries.csv',encoding="utf-8",sep=',')
  3. print(df)
  4. print(df.info())
  5. df['Dates'] = pd.to_datetime(df['Date']) #format='%m/%d/%Y' dayfirst=True yearfirst=True,
  6. print(df)
  7. print(df.info())
  8. '''
  9. Date Day Cases_Gu Cases_Ni Cases_Se Deaths_Sp
  10. 0 1/5/2015 289 2776.0 20.0 1.0 0.0
  11. 1 1/4/2015 288 2775.0 NaN NaN 6.0
  12. 0 Date 59 non-null object
  13. Date Day Cases_Gu Cases_Ni Cases_Se Deaths_Sp Dates
  14. 0 1/5/2015 289 2776.0 20.0 1.0 0.0 2015-01-05
  15. 1 1/4/2015 288 2775.0 NaN NaN 6.0 2015-01-04
  16. 6 Dates 59 non-null datetime64[ns]
  17. '''

strftime 方法,以创建显示的格式时间字符串

参考整理文章链接:python-strftime:时间字符串的格式化输出_Mr_Vague的博客-CSDN博客

1.3 加载数据集时,直接转类型

使用read_csv加载数据集时,使用parse_dates参数指定需要解析为日期的列

  1. df1 = pd.read_csv('.../country_timeseries.csv',encoding="utf-8",sep=',',parse_dates=[0])
  2. print(df1)
  3. print(df1.info())
  4. '''
  5. 0 Date 59 non-null datetime64[ns]
  6. '''

2 提取日期的各部分

借助year、month、day属性访问日期各个部分

  1. d = pd.to_datetime('2000-05-15')
  2. print(d)
  3. print(type(d)) #传入字符串,会得到一个TimeStamp对象
  4. print(d.year) #借助year、month、day属性访问日期各个部分
  5. '''
  6. 2000-05-15 00:00:00
  7. <class 'pandas._libs.tslibs.timestamps.Timestamp'>
  8. 5
  9. '''

dt访问器,在数据集中使用属性建新列

  1. df['hiyear'] = df['Dates'].dt.year
  2. df['himonth'],df['hiday'] = (df['Dates'].dt.month, df['Dates'].dt.day)
  3. print(df[['Dates','hiyear','himonth','hiday']]) #双重赋值语句
  4. print(df.info()) #数据类型也变了
  5. '''
  6. Dates hiyear himonth hiday
  7. 0 2015-01-05 2015 1 5
  8. 1 2015-01-04 2015 1 4
  9. Dates 59 non-null datetime64[ns]
  10. 7 hiyear 59 non-null int64
  11. 8 himonth 59 non-null int64
  12. 9 hiday 59 non-null int64
  13. '''

3 日期运算

3.1 加减

  1. #该数据集是记录 某日其疫情爆发的天数,该天数的计算可以从当日减去第一天的日期得到
  2. print(df['Dates'].min()) #获取数据集中第一天的日期
  3. df['days'] = df['Dates'] - df['Dates'].min() #将该日 减去 第一天日期 得到天数
  4. print(df[['Day','Dates','days']].head()) #因为数据集被我截取了,所以获取第一天的日期是错误的
  5. print(df.info()) #数据类型 得到一个timedelta对象
  6. '''
  7. Day Dates days
  8. 0 289 2015-01-05 127 days
  9. 1 288 2015-01-04 126 days
  10. 10 days 59 non-null timedelta64[ns]
  11. '''

3.2 分块计算每块的数量

year、quarter(季度)属性;size()查看每组的数量

  1. #换一个数据集
  2. bank = pd.read_csv('/banklist.csv',encoding="utf-8",sep=',',parse_dates=[5,6]) #第5 6列
  3. print(bank[['Closing Date','Updated Date']].head())
  4. #添加两列,表示银行破产的季度和年份
  5. bank['quarters'],bank['years'] = (bank['Closing Date'].dt.quarter,bank['Updated Date'].dt.year)
  6. #查看一下,季度是分为四个季度,根据月份
  7. print(bank[['Closing Date','Updated Date','quarters','years']].head())
  8. #计算每年破产银行数量
  9. closing_year = bank.groupby(['years']).size()
  10. #计算每年每个季度的银行倒闭数量
  11. closing_year_g = bank.groupby(['years','quarters']).size()
  12. print(closing_year)
  13. print(closing_year_g)
  14. #绘图查看
  15. import matplotlib.pyplot as plt
  16. fig,ax = plt.subplots()
  17. ax = closing_year.plot()
  18. plt.show()
  19. fig,ax = plt.subplots()
  20. ax = closing_year_g.plot()
  21. plt.show()
  22. '''
  23. Closing Date Updated Date
  24. 0 2017-05-26 2017-07-26
  25. 1 2017-05-05 2017-07-26
  26. 2 2017-04-28 2017-07-26
  27. 3 2017-03-03 2017-05-18
  28. Closing Date Updated Date quarters years
  29. 0 2017-05-26 2017-07-26 2 2017
  30. 1 2017-05-05 2017-07-26 2 2017
  31. years
  32. 2002 1
  33. 2016 95
  34. 2017 28
  35. 2017 1 9
  36. 2 7
  37. 3 7
  38. 4 5
  39. '''

3 对日期取数据子集

  1. #继续使用上上个数据集
  2. #可以使用布尔子集获取2014年10月份的数据
  3. print(df.loc[(df.Dates.dt.year == 2014) & (df.Dates.dt.month == 10)])

3.1 DatetimeIndex

把一个DataFrame的索引设置为 datetime,创建出 DatetimeIndex 对象

  1. #把Dates列指定为索引
  2. df.index = df['Dates']
  3. print(df.index)
  4. #把索引设置为日期对象之后,就可以直接使用日期来获取某些数据行了
  5. print(df['2015'].iloc[:4, :3]) #根据年份获取
  6. print(df['2014-09'].iloc[:2, :5]) #根据年月获取
  7. '''
  8. DatetimeIndex(['2015-01-05', '2015-01-04', '2015-01-03', '2015-01-02',
  9. '2014-12-31', '2014-12-28', '2014-12-27', '2014-12-24',
  10. Date Day Cases_Gu
  11. ..........
  12. Dates
  13. 2015-01-05 1/5/2015 289 2776.0
  14. 2015-01-04 1/4/2015 288 2775.0
  15. 2015-01-03 1/3/2015 287 2769.0
  16. 2015-01-02 1/2/2015 286 NaN
  17. Date Day Cases_Gu Cases_Ni Cases_Se
  18. Dates
  19. 2014-09-28 9/28/2014 190 1157.0 20.0 1.0
  20. 2014-09-23 9/23/2014 185 1074.0 20.0 1.0
  21. '''

3.2 TimedeltaIndex

同样可以使用 timedelta 来创建 TimedeltaIndex 对象

  1. # #上上计算过疫情爆发日期 该数据列为TimedeltaIndex
  2. # print(df['Dates'].min())
  3. # df['days'] = df['Dates'] - df['Dates'].min() #将该日 减去 第一天日期 得到天数
  4. # print(df.info)
  5. #把该列指派给index
  6. print(df)
  7. df.index = df['days']
  8. print(df.iloc[:5,:4])
  9. print(df['125 days': '119 days'].iloc[:50, :5]) #在前50个里面找从125到119之间的数量,注意顺序
  10. '''
  11. days
  12. 127 days 1/5/2015 289 2776.0 20.0
  13. 126 days 1/4/2015 288 2775.0 NaN
  14. 125 days 1/3/2015 287 2769.0 20.0
  15. 124 days 1/2/2015 286 NaN NaN
  16. 122 days 12/31/2014 284 2730.0 20.0
  17. Date Day Cases_Gu Cases_Ni Cases_Se
  18. days
  19. 125 days 1/3/2015 287 2769.0 20.0 1.0
  20. 124 days 1/2/2015 286 NaN NaN NaN
  21. 122 days 12/31/2014 284 2730.0 20.0 1.0
  22. '''

4 日期范围重建索引

创建索引 data_range 函数实现,包含startend参数

重建索引 reindex()

  1. #并不是每个数据集中的日期都是完整的,有时会缺失
  2. print(df.iloc[:5,:5])
  3. #一般解决办法是创建一个日期范围重建索引,date_range函数实现
  4. date_range = pd.date_range(start='2014-12-31',end='2015-01-05')
  5. print(date_range)
  6. #只取前五行的数据来举例
  7. df_5 = df.head()
  8. df_5.index = df_5['Dates'] #先把日期设置为索引
  9. df_5 = df_5.reindex(date_range) #再为数据重建索引
  10. print(df_5.iloc[:,:]) #缺少的日期被补齐!NaN缺失值填充,注意:Dates列被NaT填充,表示日期缺失值
  11. '''
  12. Date Day Cases_Gu ... himonth hiday days
  13. 2014-12-31 12/31/2014 284.0 2730.0 ... 12.0 31.0 122 days
  14. 2015-01-01 NaN NaN NaN ... NaN NaN NaT
  15. 2015-01-02 1/2/2015 286.0 NaN ... 1.0 2.0 124 days
  16. 2015-01-03 1/3/2015 287.0 2769.0 ... 1.0 3.0 125 days
  17. 2015-01-04 1/4/2015 288.0 2775.0 ... 1.0 4.0 126 days
  18. 2015-01-05 1/5/2015 289.0 2776.0 ... 1.0 5.0 127 days
  19. DatetimeIndex(['2014-12-31', '2015-01-01', '2015-01-02', '2015-01-03',
  20. '2015-01-04', '2015-01-05'],
  21. dtype='datetime64[ns]', freq='D')
  22. Date Day Cases_Gu
  23. Dates
  24. 2015-01-05 1/5/2015 289 2776.0
  25. 2015-01-04 1/4/2015 288 2775.0
  26. 2015-01-03 1/3/2015 287 2769.0
  27. 2015-01-02 1/2/2015 286 NaN
  28. 2014-12-31 12/31/2014 284 2730.0
  29. '''

频率 data_range 函数传入 freq参数

         freq参数取值 :参考文章链接:pandas中的freq和inferred_freq等时间参数究竟有哪些_theskylife的博客-CSDN博客

  1. #指定范围内所有的工作日 B
  2. date_range = pd.date_range('2023-5-3','2023-05-08',freq='B')
  3. print(date_range)
  4. '''
  5. DatetimeIndex(['2023-05-03', '2023-05-04', '2023-05-05', '2023-05-08'], dtype='datetime64[ns]', freq='B')
  6. '''

增加偏移量

  1. #指定范围内 隔一天取一天 2B
  2. date_range = pd.date_range('2023-5-3','2023-05-08',freq='2B')
  3. print(date_range)
  4. #指定范围内 每个月的第2个星期四 'WOM-2THU'
  5. date_range = pd.date_range('2023-5-3','2023-12-08',freq='WOM-2THU')
  6. print(date_range)
  7. '''
  8. DatetimeIndex(['2023-05-03', '2023-05-05'], dtype='datetime64[ns]', freq='2B')
  9. DatetimeIndex(['2023-05-11', '2023-06-08', '2023-07-13', '2023-08-10',
  10. '2023-09-14', '2023-10-12', '2023-11-09'],
  11. dtype='datetime64[ns]', freq='WOM-2THU')
  12. '''
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/230257
推荐阅读
相关标签
  

闽ICP备14008679号