这里只会介绍在使用Pandas过程中常用到的日期操作。
Pandas可以使用date_range()、period_range()、timedelta_range()等方法创建日期类索引,具体如下:
import pandas as pd
dt_index=pd.date_range(start='2022-01-01',periods=12,freq='MS')
pd_index=pd.period_range(start='2022-01-01',end='2023-12-01',freq='2M')
td_index=pd.timedelta_range(start='1 day',periods=10)
其结果如下:
这里要注意 date_range()中的freq参数取值范围: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
对于使用date_range()方法创造DatetimeIndex索引,可以和at_time()方法结合实现指定time数据的快速查找,具体举例如下:
import pandas as pd
dt_index=pd.date_range(start='2022-01-01',periods=10,freq='6H')
df=pd.DataFrame([[i+100] for i in range(10)],index=dt_index,columns=['col_1'])
print(df.at_time('06:00:00'))
通常使用pandas直接进行数据读取的时候,会将string类型保存的日期类型数据对应为object类型,这样很多日期类型的相关操作都无法进行。为了后续方便进行日期类操作,可以使用to_datetime()方法将string类型的数据转化为datetime类型。具体如下:
import pandas as pd
dt=pd.DataFrame([['2017-09-12','2021-01-04'],
['2018-04-06','2018-07-04'],
['2018-09-09','2019-11-24'],
['2020-10-01','2021-07-06']],
columns=['start_time','end_time'])
dt['start_time']=pd.to_datetime(dt['start_time'])
dt['end_time']=pd.to_datetime(dt['end_time'])
import pandas as pd
dt=pd.DataFrame([[1,1544064499],
[2,1544064502],
[3,1544064556]],
columns=['id','time_stamp'])
dt['time_str']=pd.to_datetime(dt['time_stamp'],unit='s',origin='unix')
若pandas中的Series或DataFrame中的某一列为datetime64类型,那么该列支持pd.Series.dt中所有属性和方法。具体属性和方法可以参考:https://pandas.pydata.org/pandas-docs/stable/reference/series.html#accessors。这里仅简单举例如下:
dt['start_year']=dt['start_time'].dt.year #开始日期所在的年份
dt['start_leap']=dt['start_time'].dt.is_leap_year #开始日期所在的年份是否为闰年
dt['date_diff']=(dt['end_time']-dt['start_time']).dt.days
dt['month_diff']=(dt['end_time'].dt.year-dt['start_time'].dt.year)*12+\
(dt['end_time'].dt.month-dt['start_time'].dt.month)
import pandas as pd
dt=pd.DataFrame([['2017-09-12',30],
['2018-04-06',17],
['2018-04-09',76],
['2020-10-01',34]],
columns=['start_time','count'])
dt['start_time']=pd.to_datetime(dt['start_time'])
#只按月进行汇总
dt_1=dt.groupby(dt['start_time'].dt.month)['count'].sum()
#按年汇总
dt_2=dt.groupby(dt['start_time'].dt.year)['count'].sum()
#按年月汇总
dt_3=dt.groupby([dt['start_time'].dt.year,dt['start_time'].dt.month])['count'].sum()