Python数据分析入门笔记:时间转换、时间抽取

时间转换

时间转换,是指将字符型的时间格式数据转化为时间型数据的过程。

  • 时间转化函数:
datetime = pandas.to_datetime(dateString,format)
  • dateString: 字符型的时间格式数据
  • format: 转化的时间型数据,该参数有以下几种选项
属性含义
%Y代表年份
%m代表月份
%d代表日期
%H代表小时
%M代表分钟
%S代表秒

时间格式化,是指将时间型数据按照指定格式,转化为字符型数据。

  • 时间格式化函数:
dateTimeFormat = datetime.dt.strftime(format)

format参数与上述相同。

日期抽取,是指从日期格式里面,抽取出需要的部分属性。

  • 抽取函数:
datetime.dt.property
属性注释
second1-60:秒,从1开始,到60
minute1-60: 分钟,从1开始,到60
hour1-24: 小时,从1开始,到24
day1-31: 一个月中的第几天,从1开始,最大为31
month1-12: 月份,从1开始,到12
year年份
weekday1-7:一周中的第几天(星期几),从1开始,最大为7

举例

原始数据

  1. 首先将注册时间转化为时间型数据。
data['registertime'] = pandas.to_datetime(data.注册时间,format='%Y/%m/%d')
data.iloc[0,3]
Out: Timestamp('2011-01-01 00:00:00')

输出:
registertime为时间格式数据'Timestamp'
现在的日期格式为’Timestamp’,想要去掉后面的时分秒,可以转化为’datetime.date’格式。

data['registertime2'] = pandas.to_datetime(data.注册时间,format='%Y/%m/%d').dt.date
data.iloc[0,4]
Out: datetime.date(2011, 1, 1)

转化为datetime.date格式
链接去掉时分秒提供另外两种方法:dt.normalize()dt.floor('d')

df = pandas.Series(pandas.date_range('20130101 09:10:12',periods=4),name='DATE')
df1 = df.dt.date
df2 = df.dt.normalize()
df3 = df.dt.floor('d')

输出:
三种去点时分秒输出结果
注意,.dt.date输出的object类,其他两种输出为datetime64
这里介绍下.dt访问器的使用。
官方文档的介绍:

Series has an accessor to succinctly return datetime like properties for the values of the Series, if it is a datetime/period like Series. This will return a Series, indexed like the existing Series.

根据官方文档,.dt访问器的对象是Series,因此在处理单条日期数据时无需使用。直接to_datetime(单条日期).date即可。

import pandas
d = pandas.to_datetime('2020/7/25 10:40',format='%Y/%m/%d %H:%M').date
d()
Out: datetime.date(2020, 7, 25)

注意,这里如果直接print(d),得到的结果是时间戳内置方法<built-in method date of Timestamp object at 0x000002188A3E6DE0>print(d())才可以将d中的值显示出来。

  1. 时间格式化dt.strftime(format)
import pandas
data = pandas.read_csv('D://Data Analysis//4.16//data.csv',sep=',')
data['registertime'] = pandas.to_datetime(data.注册时间,format='%Y/%m/%d')
# 将日期型数据转化为字符型
d = data['registertime'].dt.strftime('%Y-%m-%d')

输出:
dt.strftime()

  1. 日期抽取
import pandas
data = pandas.read_csv('D://Data Analysis//4.16//data.csv',sep=',')
data['registertime'] = pandas.to_datetime(data.注册时间,format='%Y/%m/%d')
data['rt.y'] = data['registertime'].dt.year
data['rt.m'] = data['registertime'].dt.month
data['rt.d'] = data['registertime'].dt.day
data['rt.h'] = data['registertime'].dt.hour
data['rt.M'] = data['registertime'].dt.minute
data['rt.s'] = data['registertime'].dt.second

输出:
在这里插入图片描述

时间抽取

时间抽取,是指根据一定的条件,对时间格式的数据进行抽取。

  • 根据索引进行抽取 DataFrame.ix[start,end]DataFrame.ix[dates]
  • 根据时间列进行抽取 DataFrame[condition]

举例说明,针对如下的DataFrame。

第一步,需要将date列的时间数据转化为datetime格式。

原始DataFrame
第一种方法,在读取时就转化数据格式。
pandas.read_csv()函数包含众多参数,这里介绍相关的两个参数:parse_datesdate_parser
parse_dates参数实际上是说明解析哪一列数据为日期格式。
parse_dates官方文档的介绍:

parse_dates: bool or list of int or names or list of lists or dict, default False
The behavior is as follows:
boolean. If True -> try parsing the index.
list of int or names. e.g. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a separate date column.
list of lists. e.g. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date column.
dict, e.g. {‘foo’ : [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’
If a column or index cannot be represented as an array of datetimes, say because of an unparseable value or a mixture of timezones, the column or index will be returned unaltered as an object data type. For non-standard datetime parsing, use pd.to_datetime after pd.read_csv. To parse an index or column with a mixture of timezones, specify date_parser to be a partially-applied pandas.to_datetime() with utc=True. See Parsing a CSV with mixed timezones for more.
Note: A fast-path exists for iso8601-formatted dates.

翻译一下文档:

parse_dates格式:bool或list或int或names或list of lists或dict,默认False
每个格式对应的操作:
布尔值。如果为True,解析index为日期格式。

例如
将rq列作为index并解析
rq列作为index,并解析。

data1 = pandas.read_csv('D://Data Analysis//4.17//data1.csv',sep=',',parse_dates=True,index_col=0)

输出:
在这里插入图片描述

parse_dates格式:bool或list或int或names或list of lists或dict,默认False
每个格式对应的操作:
list of int or names。如果为[1,2,3],则分别解析1,2,3列为date数据。

例如:

data2 = pandas.read_csv('D://Data Analysis//4.17//data1.csv',sep=',',parse_dates=[0,1])

输出:
在这里插入图片描述

parse_dates格式:bool或list或int或names或list of lists或dict,默认False
每个格式对应的操作:
list of lists。如果为[[1,2]],则将1,2两列合并后解析数据,然后返回一个合并的date列。

例如

csv数据:
rq,time,value
20160101,100234,10930
20160102,100235,10318
20160103,100236,10595

data3 = pandas.read_csv('D://Data Analysis//4.17//data1.csv',sep=',',parse_dates=[[0,1]])

输出:
在这里插入图片描述
根据数据可以看出,合并后的列名直接是在两个列名之间加’_’。如果需要自己定义列名,则用到最后dict形式。

parse_dates格式:bool或list或int或names或list of lists或dict,默认False
每个格式对应的操作:
dict。如果为{‘foo’:[1,3]},则将1,3两列合并后解析数据,然后返回一个合并的date列,并将列名改为foo

data4 = pandas.read_csv('D://Data Analysis//4.17//data1.csv',sep=',',parse_dates={'newdate':[0,1]})

输出:
在这里插入图片描述
注意,这里额外介绍另一个参数infer_datetime_format,这个参数格式为bool,默认False。当parse_dates可以解析列时,设置这个参数为True,某些情况下可以加快5~10倍。

date_parser参数: function, optional。实际上可以是一个函数,指定处理时间格式数据的方法。例如指定用strptime函数处理日期数据。

dateparser = lambda dates:pandas.datetime.strptime(dates,'%Y%m%d')

data5 = pandas.read_csv('D://Data Analysis//4.17//data.csv',
                        sep=',',
                        parse_dates=['date'],
                        date_parser=dateparser,
                        index_col='date')

输出:
在这里插入图片描述
第二种,在读取后转化格式,to_datetime()即可做到。

接下来,要选择抽取的时间段。

# 例如抽取2016-2-1至2016-2-5的数据
import datetime
dateparser = lambda dates:pandas.datetime.strptime(dates,'%Y%m%d')
data = pandas.read_csv('D://Data Analysis//4.17//data.csv',
                        sep=',',
                        parse_dates=['date'],
                        date_parser=dateparser,
                        index_col='date')
dt1 = datetime.date(year=2016,month=2,day=1)
dt2 = datetime.date(year=2016,month=2,day=5)
# 取两个日期之间的数据
data.ix[dt1:dt2]
#取这两个数据
data.ix[[dt1,dt2]]

# 按列抽取
data = pandas.read_csv('D://Data Analysis//4.17//data.csv',
                        sep=',',
                        parse_dates=['date'],
                        date_parser=dateparser)
data[(data.date>=dt1)&(data.date<=dt2)]

输出:

Out[155]: 
            value
date             
2016-02-01  11261
2016-02-02   8713
2016-02-03   7299
2016-02-04  10424
2016-02-05  10795

data.ix[[dt1,dt2]]
Out[156]: 
            value
date             
2016-02-01  11261
2016-02-05  10795

Out[157]: 
         date  value
31 2016-02-01  11261
32 2016-02-02   8713
33 2016-02-03   7299
34 2016-02-04  10424
35 2016-02-05  10795
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值