pandas处理日期的几种常用方法
1.讀取字符串日期
寫入csv 文件
csv_text = """date, value 2022-01-01, 1 2022-01-05, 5 2022-11-05, 5 """ with open("date_text.csv", "w") as f:f.write(csv_text)讀取日期
df = pd.read_csv("date_text.csv") print(df) print(df.dtypes)輸出
date value 0 2022-01-01 1 1 2022-01-05 5 2 2022-11-05 5 date objectvalue int64 dtype: object上面的結(jié)果中,date列的類型被讀作object類型,而不是一個(gè)datetime類型
一個(gè)簡(jiǎn)單的方式是讓pandas解析日期,傳入?yún)?shù)parse_date給read_csv方法,會(huì)得到datetime對(duì)象的date列:
輸出
date value 0 2022-01-01 1 1 2022-01-05 5 2 2022-11-05 5 date datetime64[ns]value int64 dtype: objectpandas中融合了很強(qiáng)大的日期解析方法,許多類型的日期都可以自動(dòng)解析
有時(shí)候數(shù)據(jù)格式是這樣的:
csv_text = """y,m,d,value 2022,01,02, 2 2022,01,03, 3 2022,11,05, 5 """ with open("date_text.csv", "w") as f:f.write(csv_text)讀取日期的方式
df = pd.read_csv("date_text.csv", parse_dates={"date": ["y", "m", "d"]}) print(df)為了從多列中解析出一個(gè)日期列,只需要給parse_dates參數(shù)傳入一個(gè)字典對(duì)象指定要解析的列即可
2.指定日期格式
對(duì)于日期01/11/2022,格式可以理解為mm/dd/yyyy解析得到2022-01-11,也可以理解為dd/mm/yyyy解析得2022-11-01,是存在這樣的不同的使用格式的,要明確格式,可以指定dayfirst參數(shù):
寫入csv文件
讀取數(shù)據(jù)
df = pd.read_csv("date_text.csv", parse_dates=["date"], dayfirst=True) print(df) df = pd.read_csv("date_text.csv", parse_dates=["date"], dayfirst=False) print(df)輸出
date value 0 2022-02-01 2 1 2022-03-01 3 2 2022-05-11 5date value 0 2022-01-02 2 1 2022-01-03 3 2 2022-11-05 5除了使用dayfirst參數(shù),也可以使用參數(shù)infer_datetime_format,將其設(shè)置為True,會(huì)自動(dòng)推斷默認(rèn)的日期類型
指定date_parser來確定自定義的特殊的日期格式
假設(shè)輸入的格式是這樣的:
使用infer_datetime_format參數(shù)是沒辦法推斷出日期格式的
df = pd.read_csv("date_text.csv", parse_dates=["date"], infer_datetime_format=True) print(df)輸出
date value 0 Jan_01_2022 2 1 Jun_03_2022 3 2 NOV_05_2022 5此時(shí)可以指定date_parser來執(zhí)行解析
from datetime import datetime fmt = "%b_%d_%Y" df = pd.read_csv("date_text.csv", parse_dates=["date"], date_parser=lambda x: datetime.strptime(x, fmt)) print(df)輸出
date value 0 2022-01-01 2 1 2022-06-03 3 2 2022-11-05 5麻煩的是確定strptime的日期格式,不過你可以在這個(gè)網(wǎng)站上參考字符串日期解析成日期對(duì)象的格式
3.轉(zhuǎn)換為datetime類型
可以使用pandas的to_datetime方法(參考pandas官網(wǎng)):
pandas.to_datetime(arg, errors=‘raise’, dayfirst=False,
yearfirst=False, utc=None, format=None, exact=True, unit=None,
infer_datetime_format=False, origin=‘unix’, cache=True)
to_datetime方法包含了絕大多數(shù)你需要執(zhí)行的操作,而且arg既可以傳入一個(gè)日期字符串參數(shù)也可以傳入一個(gè)日期字符串列表
4.創(chuàng)建范圍日期
使用pandas的date_range方法創(chuàng)建指定范圍的日期
指定開始日期start和結(jié)束日期end創(chuàng)建范圍類的日期
輸出
DatetimeIndex(['2021-11-01', '2021-11-02', '2021-11-03', '2021-11-04','2021-11-05'],dtype='datetime64[ns]', freq='D')傳入start日期或者end日期并傳入period指定范圍長度
start = "2021-11-01" date_range1 = pd.date_range(start=start, periods=7) print(date_range1)end = "2021-11-01" date_range2 = pd.date_range(end=end, periods=7) print(date_range2) DatetimeIndex(['2021-11-01', '2021-11-02', '2021-11-03', '2021-11-04','2021-11-05', '2021-11-06', '2021-11-07'],dtype='datetime64[ns]', freq='D') DatetimeIndex(['2021-10-26', '2021-10-27', '2021-10-28', '2021-10-29','2021-10-30', '2021-10-31', '2021-11-01'],dtype='datetime64[ns]', freq='D')間隔類型指定為年(Y)、月(M)、時(shí)(H)等,指定timezone已經(jīng)左右開閉
# 以月份為間隔 end = "2021-11-30" month_range1 = pd.date_range(end=end, periods=3, freq='2M') # freq也可以用pd.offsets.MonthEnd(2) print(month_range1)# tz指定時(shí)區(qū) end = "2021-11-30" month_range2 = pd.date_range(end=end, periods=3, freq='2H', tz="UTC+08:00") print(month_range2) # closed指定開閉區(qū)間,略 DatetimeIndex(['2021-07-31', '2021-09-30', '2021-11-30'], dtype='datetime64[ns]', freq='2M') DatetimeIndex(['2021-11-29 20:00:00+08:00', '2021-11-29 22:00:00+08:00','2021-11-30 00:00:00+08:00'],dtype='datetime64[ns, UTC+08:00]', freq='2H')5.提取datetime對(duì)象的date,time等部分
使用pandas的dt accessor提取datetime對(duì)象中的各部分
start = "2021-11-02" date_range1 = pd.date_range(start=start, periods=7, tz="UTC+08:00") df = pd.DataFrame({"value": [i for i in range(7)], "date": date_range1}) # print(df) df["date"], df["time"], df["tz"] = df["date"].dt.date, df["date"].dt.time, df["date"].dt.tz print(df) # (還可以提取weekday之類的!) # print("weekday: \n", df["date"].dt.weekday) value date time tz 0 0 2021-11-02 00:00:00 UTC+08:00 1 1 2021-11-03 00:00:00 UTC+08:00 2 2 2021-11-04 00:00:00 UTC+08:00 3 3 2021-11-05 00:00:00 UTC+08:00 4 4 2021-11-06 00:00:00 UTC+08:00 5 5 2021-11-07 00:00:00 UTC+08:00 6 6 2021-11-08 00:00:00 UTC+08:006.轉(zhuǎn)換時(shí)區(qū)
生成utc+8時(shí)區(qū)的一個(gè)范圍時(shí)間,然后使用tz_convert方法轉(zhuǎn)換時(shí)區(qū),使用strftime方法轉(zhuǎn)換格式
# 指定時(shí)區(qū)偏移 tz_offset = 8 utc_ofst = 3600*tz_offset # 生成指定時(shí)區(qū)的范圍日期 end = "2021-11-30" dates = pd.date_range(end=end, periods=3, tz=utc_ofst) print(dates) # 將日期時(shí)間轉(zhuǎn)換為0時(shí)區(qū)時(shí)間,然后格式化成字符串 fmt = "%Y-%m-%d %H:%M:%S" print([date.tz_convert(pytz.utc).strftime(fmt) for date in dates]) DatetimeIndex(['2021-11-28 00:00:00+08:00', '2021-11-29 00:00:00+08:00','2021-11-30 00:00:00+08:00'],dtype='datetime64[ns, pytz.FixedOffset(480)]', freq='D') ['2021-11-27 16:00:00', '2021-11-28 16:00:00', '2021-11-29 16:00:00']總結(jié)
以上是生活随笔為你收集整理的pandas处理日期的几种常用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pytorch神经网络实战案例】03
- 下一篇: git版本控制系统常用指令,Xmind笔