所有 Notebook 的源文件都可以在 GitHub 上访问到呀~

Date Functionality in Pandas

Types

  • Pandas有四个主要的与时间有关的类 Timestamp、DatetimeIndex、Period、PeriodIndex
In [9]:
import pandas as pd
import numpy as np

Timestamp

  • timestamp 代表一个单一的时间戳,并将值与时间点相关联
  • 在大多数情况下,timestamp与python datetime是可以互换的
In [10]:
#使用一个string创建一个timestamp
pd.Timestamp("8/29/2020 09:32AM")
Out[10]:
Timestamp('2020-08-29 09:32:00')

Period

  • 如果并不是对精确的时间点感兴趣,而是想要一个时间段,这就是period
  • period代表一个单一的时间段,例如某天、某月
In [11]:
#创建一个月的period
pd.Period("8/2020")
Out[11]:
Period('2020-08', 'M')
In [12]:
#创建一天的period
pd.Period("8/29/2020")
Out[12]:
Period('2020-08-29', 'D')

DatetimeIndex

  • 时间戳的index就是datetimeIndex时间戳索引
In [13]:
#创建series t1,三个timestamp就是index,value分别是a、b、c
t1 = pd.Series(list("abc"),[pd.Timestamp("2020-8-29"), pd.Timestamp("2020-08-30"), pd.Timestamp("2020-08-31")])
t1
Out[13]:
2020-08-29    a
2020-08-30    b
2020-08-31    c
dtype: object
In [14]:
#t1.index的类型是DatetimeIndex
type(t1.index)
Out[14]:
pandas.core.indexes.datetimes.DatetimeIndex

PeriodIndex

  • 与DatetimeIndex相类似的是,period的index就是PeriodIndex
In [15]:
#创建series t2,三个period就是index,value分别是d、e、f
t2 = pd.Series(list("def"), [pd.Period("2020-08"), pd.Period("2020-09"), pd.Period("2020-10")])
t2
Out[15]:
2020-08    d
2020-09    e
2020-10    f
Freq: M, dtype: object
In [16]:
#t2.index的类型是PeriodIndex
type(t2.index)
Out[16]:
pandas.core.indexes.period.PeriodIndex

Converting to Datetime

In [17]:
#d1是一个list,其中的时间是不同格式的时间
#创建DataFrame ts3,其中index即为d1中的时间,column为a、b,value为随机数
d1 = ["2 June 2020", "Aug 29, 2020", "2020-08-03", "6/3/20"]
ts3 = pd.DataFrame(np.random.randint(10, 100, (4, 2)), index = d1, columns = list("ab"))
ts3
Out[17]:
a b
2 June 2020 74 48
Aug 29, 2020 91 76
2020-08-03 37 13
6/3/20 29 23
In [18]:
#使用to_datetime可以将这些时间转换为datetime,而且是标准格式
ts3.index = pd.to_datetime(ts3.index)
ts3
Out[18]:
a b
2020-06-02 74 48
2020-08-29 91 76
2020-08-03 37 13
2020-06-03 29 23
In [19]:
#to_datetime还可以改变这些日期的顺序,可以通过dayfirst = True来以欧洲日期的格式解析日期
pd.to_datetime("5.12.20", dayfirst = True)
Out[19]:
Timestamp('2020-12-05 00:00:00')

Timedeltas

  • 计时器是时间上的差异
In [20]:
#当计算9/13/2019与9/2/2019之间的差值时,可以得到11天的timedeltas
pd.Timestamp("9/13/2019")-pd.Timestamp("9/2/2019")
Out[20]:
Timedelta('11 days 00:00:00')
In [21]:
#还可以查找9/2/2016 8:10AM之后的12天3小时
pd.Timestamp("9/2/2016 8:10AM") + pd.Timedelta("12D 3H")
Out[21]:
Timestamp('2016-09-14 11:10:00')

Working with Dates in a Dataframe

In [22]:
#假设要看九次测量,每两周一次,每周日一次,从10-01-2020开始
#使用date_range,创建DatetimeIndex
dates = pd.date_range("10-01-2020", periods = 9, freq = "2W-SUN")
dates
Out[22]:
DatetimeIndex(['2020-10-04', '2020-10-18', '2020-11-01', '2020-11-15',
               '2020-11-29', '2020-12-13', '2020-12-27', '2021-01-10',
               '2021-01-24'],
              dtype='datetime64[ns]', freq='2W-SUN')
In [23]:
#用这些dates创建DateFrame,value为随机数据,index为dates
df = pd.DataFrame({"Count 1" : 100 + np.random.randint(-5, 10, 9).cumsum(),
                   "Count 2" : 120 + np.random.randint(-5, 10, 9)},
                 index = dates)
df
Out[23]:
Count 1 Count 2
2020-10-04 104 122
2020-10-18 106 124
2020-11-01 103 126
2020-11-15 98 121
2020-11-29 100 119
2020-12-13 99 127
2020-12-27 107 129
2021-01-10 103 124
2021-01-24 111 123
In [24]:
#可以用diff计算每个日期的差值
df.diff()
Out[24]:
Count 1 Count 2
2020-10-04 NaN NaN
2020-10-18 2.0 2.0
2020-11-01 -3.0 2.0
2020-11-15 -5.0 -5.0
2020-11-29 2.0 -2.0
2020-12-13 -1.0 8.0
2020-12-27 8.0 2.0
2021-01-10 -4.0 -5.0
2021-01-24 8.0 -1.0
In [25]:
#如果想要知道DateFrame中每个月count的平均值是什么,可以使用resample
df.resample("M").mean()
Out[25]:
Count 1 Count 2
2020-10-31 105.000000 123.0
2020-11-30 100.333333 122.0
2020-12-31 103.000000 128.0
2021-01-31 107.000000 123.5
In [26]:
#可以使用部分字符串索引从一个特定的年查找值
df["2020"]
Out[26]:
Count 1 Count 2
2020-10-04 104 122
2020-10-18 106 124
2020-11-01 103 126
2020-11-15 98 121
2020-11-29 100 119
2020-12-13 99 127
2020-12-27 107 129
In [27]:
#可以使用部分字符串从一个特定的月查找值
df["2020-10"]
Out[27]:
Count 1 Count 2
2020-10-04 104 122
2020-10-18 106 124
In [28]:
#可以通过切片,查找一个时间范围
df["2020-10":]
Out[28]:
Count 1 Count 2
2020-10-04 104 122
2020-10-18 106 124
2020-11-01 103 126
2020-11-15 98 121
2020-11-29 100 119
2020-12-13 99 127
2020-12-27 107 129
2021-01-10 103 124
2021-01-24 111 123
In [29]:
#还可以使用asfre改变DataFrame中日期的频率
#如果想要将频率从两周一次改为一周一次,那么每隔一周就会出现一次缺失值,可以使用fill方法填充那些缺失值
df.asfreq("W", method = "ffill")
Out[29]:
Count 1 Count 2
2020-10-04 104 122
2020-10-11 104 122
2020-10-18 106 124
2020-10-25 106 124
2020-11-01 103 126
2020-11-08 103 126
2020-11-15 98 121
2020-11-22 98 121
2020-11-29 100 119
2020-12-06 100 119
2020-12-13 99 127
2020-12-20 99 127
2020-12-27 107 129
2021-01-03 107 129
2021-01-10 103 124
2021-01-17 103 124
2021-01-24 111 123
In [30]:
#绘制时间Series
import matplotlib.pyplot as plt
%matplotlib inline
#使用plot绘图
df.plot()
Out[30]:
<matplotlib.axes._subplots.AxesSubplot at 0x221adaf1430>