52_Pandas处理日期和时间列(字符串转换、日期提取等)

52_Pandas处理日期和时间列(字符串转换、日期提取等)

将解释如何操作表示 pandas.DataFrame 的日期和时间(日期和时间)的列。字符串与 datetime64[ns] 类型的相互转换,将日期和时间提取为数字的方法等。

以下内容进行说明。

将字符串转换为 datetime64[ns] 类型(时间戳类型):to_datetime()

时间戳类型属性/方法

使用 dt 访问器批量处理整个列

对于日期时间索引

从文件读取时将字符串转换为 datetime64[ns] 类型

如何将 datetime64[ns] 类型指定为索引并将其处理为时序数据以及如何使用,请参考以下文章。

以带有以下 csv 文件的 pandas.DataFrame 为例。

import pandas as pd
import datetime

df = pd.read_csv('./data/sample_datetime_multi.csv')

print(df)

将字符串转换为 datetime64[ns] 类型(时间戳类型):to_datetime()

print(pd.to_datetime(df['A']))

如果格式不标准,请在参数格式中指定格式字符串。

print(pd.to_datetime(df['B'], format='%Y年%m月%d日 %H时%M分'))

即使原始格式不同,如果指示的日期和时间相同,则 datetime64[ns] 类型值是等价的。

print(pd.to_datetime(df['A']) == pd.to_datetime(df['B'], format='%Y年%m月%d日 %H时%M分'))

如果要将转换为 datetime64[ns] 类型的列作为新列添加到 pandas.DataFrame,请指定新列名并分配它。如果您指定原始列名,它将被覆盖。

df['X'] = pd.to_datetime(df['A'])

print(df)

时间戳类型属性/方法

pandas.to_datetime() 函数转换的列的dtype是datetime64[ns]类型,每个元素都是Timestamp类型。

print(df)

print(df.dtypes)

print(df['X'][0])

print(type(df['X'][0]))

Timestamp 类型继承并扩展了 Python 标准库 datetime 的 datetime 类型。

print(issubclass(pd.Timestamp, datetime.datetime))

可以获取年、月、日(年、月、日)、时、分、秒(时、分、秒)、星期几(字符串:weekday_name,数字:dayofweek)等作为属性。

print(df['X'][0].year)

print(df['X'][0].weekday_name)

还可以使用 to_pydatetime() 转换为 Python 标准库 datetime 类型,使用 to_datetime64() 转换为 NumPy datetime64[ns] 类型。

py_dt = df['X'][0].to_pydatetime()
print(type(py_dt))

dt64 = df['X'][0].to_datetime64()
print(type(dt64))

timestamp() 是一种以浮点浮点类型返回 UNIX 时间(纪元秒 = 自 1970 年 1 月 1 日 00:00:00 以来的秒数)的方法。如果需要整数,请使用 int()。

print(df['X'][0].timestamp())

print(pd.to_datetime('1970-01-01 00:00:00').timestamp())

print(int(df['X'][0].timestamp()))

与 Python 标准库中的 datetime 类型一样,strftime() 可用于转换为任何格式的字符串。请参阅下文,了解如何将其应用于列的所有元素。

print(df['X'][0].strftime('%Y/%m/%d'))

使用 dt 访问器批量处理整个列

有一个 str 访问器将字符串处理应用于整个 pandas.Series。

与Timestamp类型一样,年、月、日(年、月、日)、时、分、秒(时、分、秒)、星期几(字符串:weekday_name,数字:dayofweek)等都可以作为属性获得。 在 dt 之后写下每个属性名称。 pandas.Series 的每个元素都被处理并返回 pandas.Series。

print(df['X'].dt.year)

print(df['X'].dt.hour)

也可以使用 dayofweek(星期一为 0,星期日为 6)仅提取一周中特定日期的行。

print(df['X'].dt.dayofweek)

print(df[df['X'].dt.dayofweek == 4])

当使用 astype() 方法将 datetime64[ns] 类型的列转换为字符串 str 类型时,它会转换为标准格式的字符串。

print(df['X'].astype(str))

dt.strftime() 可用于一次将列转换为任何格式的字符串。也可以使其成为仅具有日期或仅具有时间的字符串。

print(df['X'].dt.strftime('%A, %B %d, %Y'))

print(df['X'].dt.strftime('%Y年%m月%d日'))

如果要将转换为字符串的列作为新列添加到 pandas.DataFrame,请指定新列名并分配它。如果您指定原始列名,它将被覆盖。

df['en'] = df['X'].dt.strftime('%A, %B %d, %Y')
df['cn'] = df['X'].dt.strftime('%Y年%m月%d日')

print(df)

可以使用 dt.to_pydatetime() 获得一个 NumPy 数组 ndarray,其元素是 Python 标准库的日期时间类型对象。

print(df['X'].dt.to_pydatetime())

print(type(df['X'].dt.to_pydatetime()))
print(type(df['X'].dt.to_pydatetime()[0]))

NumPy的datetime64[ns]类型数组可以用values属性代替方法获取。

print(df['X'].values)

print(type(df['X'].values))
print(type(df['X'].values[0]))

例如,Timestamp 类型有一个返回 UNIX 时间(秒)的方法 (timestamp()),但 dt 访问器没有。在这种情况下,使用 map() 即可。

print(df['X'].map(pd.Timestamp.timestamp))

如果要转换为整数 int 类型,请使用 astype() 方法。

print(df['X'].map(pd.Timestamp.timestamp).astype(int))

对于日期时间索引

在处理时间序列数据时非常有用。有关详细信息,请参阅下面的文章。

在示例中,set_index() 用于将现有列指定为索引,为方便起见,使用 drop() 方法删除多余的列。

df_i = df.set_index('X').drop(['en', 'cn'], axis=1)

print(df_i)

print(df_i.index)

DatetimeIndex 类型索引具有年、月、日(年、月、日)、时、分、秒(时、分、秒)、星期几(字符串:weekday_name,数字:dayofweek)等属性,以及方法如由于提供了 strftime(),因此可以一次处理所有索引元素,而无需通过 dt 属性。

返回类型因属性和方法而异,不是pandas.Series,但如果要在pandas.DataFrame中添加新列,可以指定新列名并分配。

print(df_i.index.minute)

print(df_i.index.strftime('%y/%m/%d'))

df_i['min'] = df_i.index.minute
df_i['str'] = df_i.index.strftime('%y/%m/%d')

print(df_i)

从文件读取时将字符串转换为 datetime64[ns] 类型

从文件中读取数据时,可以在读取时将字符串转换为 datetime64[ns] 类型。 对于 pandas.read_csv() 函数,在参数 parse_dates 中指定要转换为 datetime64[ns] 类型的列号列表。请注意,即使只有一个,也必须列出。

df_csv = pd.read_csv('data/sample_datetime_multi.csv', parse_dates=[0])

print(df_csv)

print(df_csv.dtypes)

df_csv_jp = pd.read_csv('./data/sample_datetime_multi.csv',
                        parse_dates=[1],
                        date_parser=lambda date: pd.to_datetime(date, format='%Y年%m月%d日 %H时%M分'))

print(df_csv_jp)

print(df_csv_jp.dtypes)

可以使用参数 index_col 指定要索引的列。

在这种情况下,如果参数 parse_dates=True,索引列将被转换为 datetime64[ns] 类型。

df_csv_jp_i = pd.read_csv('./data/sample_datetime_multi.csv',
                          index_col=1,
                          parse_dates=True,
                          date_parser=lambda date: pd.to_datetime(date, format='%Y年%m月%d日 %H时%M分'))

print(df_csv_jp_i)

print(df_csv_jp_i.index)

读取 Excel 文件的 pandas.read_excel() 函数也有参数 parse_dates、date_parser 和 index_col,因此在读取时也可以进行类似的转换。有关 pandas.read_excel() 函数的信息,请参阅以下文章。

Original: https://blog.csdn.net/qq_18351157/article/details/127703926
Author: 饺子大人
Title: 52_Pandas处理日期和时间列(字符串转换、日期提取等)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788082/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球