22-Pandas日期时间格式化

发布于:2024-07-03 ⋅ 阅读:(22) ⋅ 点赞:(0)

Pandas日期时间格式化

当进行数据分析时,我们会遇到很多带有日期、时间格式的数据集,在处理这些数据集时,可能会遇到日期格式不统一的问题,此时就需要对日期时间做统一的格式化处理。比如“Wednesday, June 6, 2020”可以写成“6/6/20”,或者写成“06-06-2020。

日期格式化符号

在对时间进行格式化处理时,它们都有固定的表示格式,比如小时的格式化符号为%H ,分钟简写为%M ,秒简写为%S。下表对常用的日期格式化符号做了总结:

符号 说明
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地英文缩写星期名称
%A 本地英文完整星期名称
%b 本地缩写英文的月份名称
%B 本地完整英文的月份名称
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%U 一年中的星期数(00-53)星期天为星期的开始
%j 年内的一天(001-366)
%c 本地相应的日期表示和时间表示

Python处理

Python 内置的 strptime() 方法能够将字符串日期转换为 datetime 类型,下面看一组示例:

import pandas as pd
from  datetime import datetime
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")

date_str =empdata.loc[:,'HIREDATE']
for d in date_str:
    print(f"转换前数据:{d},转换前的数据类型:{type(d)},转换后的数据类型:{type(datetime.strptime(d,'%Y-%m-%d'))}")

输出结果:

转换前数据:1980-12-17,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-02-20,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-02-22,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-04-02,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-09-28,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-05-01,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-06-09,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1987-04-19,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-11-17,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-09-08,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1987-05-23,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-12-03,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1981-12-03,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>
转换前数据:1982-01-23,转换前的数据类型:<class 'str'>,转换后的数据类型:<class 'datetime.datetime'>

我们发现,从csv文件中读取的数据类型为str类型,通过datetime.strptime()转换后变为了datetime.datetime类型。也就是将字符串转换为了时间类型。

注意:strftime() 可以将 datetime 类型转换为字符串类型,恰好与 strptime() 相反。

import pandas as pd
from  datetime import datetime
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")

date_str =empdata.loc[:,'HIREDATE']
for d in date_str:
    print(f"转换前格式:{d},转换后的格式:{datetime.strftime(datetime.strptime(d,'%Y-%m-%d'),'%Y.%m.%d %H:%M:%S')}")

运行结果:

转换前格式:1980-12-17,转换后的格式:1980.12.17 00:00:00
转换前格式:1981-02-20,转换后的格式:1981.02.20 00:00:00
转换前格式:1981-02-22,转换后的格式:1981.02.22 00:00:00
转换前格式:1981-04-02,转换后的格式:1981.04.02 00:00:00
转换前格式:1981-09-28,转换后的格式:1981.09.28 00:00:00
转换前格式:1981-05-01,转换后的格式:1981.05.01 00:00:00
转换前格式:1981-06-09,转换后的格式:1981.06.09 00:00:00
转换前格式:1987-04-19,转换后的格式:1987.04.19 00:00:00
转换前格式:1981-11-17,转换后的格式:1981.11.17 00:00:00
转换前格式:1981-09-08,转换后的格式:1981.09.08 00:00:00
转换前格式:1987-05-23,转换后的格式:1987.05.23 00:00:00
转换前格式:1981-12-03,转换后的格式:1981.12.03 00:00:00
转换前格式:1981-12-03,转换后的格式:1981.12.03 00:00:00
转换前格式:1982-01-23,转换后的格式:1982.01.23 00:00:00

Pandas处理

除了使用 Python 内置的 strptime() 方法外,你还可以使用 Pandas 模块的 pd.to_datetime() 和 pd.DatetimeIndex() 进行转换。

1) to_datetime()

通过 to_datetime() 直接转换为 datetime 类型

import pandas as pd
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")

date_str =empdata.loc[:,'HIREDATE']
date_time = pd.to_datetime(date_str)
print(date_time)

输出结果:

0    1980-12-17
1    1981-02-20
2    1981-02-22
3    1981-04-02
4    1981-09-28
5    1981-05-01
6    1981-06-09
7    1987-04-19
8    1981-11-17
9    1981-09-08
10   1987-05-23
11   1981-12-03
12   1981-12-03
13   1982-01-23
Name: HIREDATE, dtype: datetime64[ns]

是不是比python中的strptime()更加好用呢?(_)

2) DatetimeIndex()
import pandas as pd
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")

date_str =empdata.loc[:,'HIREDATE']
date_time = pd.DatetimeIndex(date_str)
print(date_time)

运行结果:

DatetimeIndex(['1980-12-17', '1981-02-20', '1981-02-22', '1981-04-02',
               '1981-09-28', '1981-05-01', '1981-06-09', '1987-04-19',
               '1981-11-17', '1981-09-08', '1987-05-23', '1981-12-03',
               '1981-12-03', '1982-01-23'],
              dtype='datetime64[ns]', name='HIREDATE', freq=None)

使用 Datetimeindex() 函数设置时间序,示例如下:

import pandas as pd
import numpy as np
empdata = pd.read_csv("C:\\Users\\qwy\\Desktop\\data\\empdata.csv")

date_str =empdata.loc[:,'HIREDATE']
date_time = pd.DatetimeIndex(date_str)

df = pd.Series(np.random.randn(14),index = date_time)
print(df)

输出结果:

1980-12-17   -0.118801
1981-02-20    0.049266
1981-02-22   -0.680420
1981-04-02    0.443656
1981-09-28    0.685218
1981-05-01    2.269103
1981-06-09   -0.704363
1987-04-19   -0.256806
1981-11-17   -0.855622
1981-09-08   -1.782622
1987-05-23    1.270465
1981-12-03   -1.282576
1981-12-03    0.710341
1982-01-23    0.545944
dtype: float64