7-1 时间索引的随访档案


文档摘要

7-1 时间索引:建立随访档案 本节摘要:todatetime把日期文本升格为datetime64血型,升格后的DatetimeIndex支持字符串直接切片与部分索引;Timestamp、Period、Timedelta是三种时间血型,时区转换是跨国随访的慢性病。本节把病史装上时间轴。 第01章埋的伏笔(parsedates)在这里正式展开。日期只要还是文本,"3月"就只能靠字符串前缀去猜;升格为时间类型后,切片、对齐、重采样全部免费获得。 建档:从文本到datetime64 ⚠️ 常见坑:格式混乱的日期列让Pandas猜格式,几十万行时又慢又易猜错。固定格式用format参数一次说清:pd.todatetime(s, format='%Y年%m月%d日')。

7-1 时间索引:建立随访档案

本节摘要:to_datetime把日期文本升格为datetime64血型,升格后的DatetimeIndex支持字符串直接切片与部分索引;Timestamp、Period、Timedelta是三种时间血型,时区转换是跨国随访的慢性病。本节把病史装上时间轴。

第01章埋的伏笔(parse_dates)在这里正式展开。日期只要还是文本,"3月"就只能靠字符串前缀去猜;升格为时间类型后,切片、对齐、重采样全部免费获得。

建档:从文本到datetime64

import pandas as pd df = pd.DataFrame({ '日期': ['2024-01-03', '2024-01-10', '2024-01-15', '2024-02-01'], '金额': [1280, 1732, 880, 1150], }) # 升格第一式:列转类型 df['日期'] = pd.to_datetime(df['日期']) print(df.dtypes) # 日期 datetime64[ns] # 金额 int64 # 升格第二式:直接当挂号条 ts = df.set_index('日期').sort_index() # 时间索引务必排序 print(ts) # 金额 # 日期 # 2024-01-03 1280 # 2024-01-10 1732 # 2024-01-15 880 # 2024-02-01 1150

⚠️ 常见坑:格式混乱的日期列让Pandas猜格式,几十万行时又慢又易猜错。固定格式用format参数一次说清:pd.to_datetime(s, format='%Y年%m月%d日')。解析不了的脏值加errors='coerce'转NaN,再回第03章流程处置。

时间切片:字符串直接上

# DatetimeIndex的专属待遇:字符串切片,双闭 print(ts.loc['2024-01'].sum()) # 金额 3892 print(ts.loc['2024-01-05':'2024-01-20']) # 金额 # 日期 # 2024-01-10 1732 # 2024-01-15 880 # 部分索引:取年份、月份的快捷属性 print(ts.index.month.tolist()) # [1, 1, 1, 2] print(ts.index.day_name().tolist()) # ['Wednesday', 'Wednesday', 'Monday', 'Thursday']

这些索引属性是后续分组的好材料:ts.groupby(ts.index.month).sum()直接出月报——不过更正规的重采样在下一节。

随访日历:date_range

# 造一张完整日历:体检中心按天排班 cal = pd.date_range('2024-01-01', '2024-01-05', freq='D') print(cal) # DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', # '2024-01-04', '2024-01-05'], dtype='datetime64[ns]', freq='D') # 工作日频率:W表示周,B表示工作日,MS表示月初 print(pd.date_range('2024-01-01', periods=3, freq='MS')) # DatetimeIndex(['2024-01-01', '2024-02-01', '2024-03-01'], ...) # 缺勤检查:日历对齐后reindex,缺勤日现形 full = pd.Series(0.0, index=pd.date_range('2024-01-01', '2024-01-05')) visited = pd.Series([1280, 880], index=pd.to_datetime(['2024-01-03', '2024-01-05'])) record = full.add(visited, fill_value=0) print(record[record == 0].index.tolist()) # [Timestamp('2024-01-01'), Timestamp('2024-01-02'), Timestamp('2024-01-04')]

三种时间血型与时区

# Timestamp:某一刻(心电图上的一个点) t = pd.Timestamp('2024-01-15 14:30:00') # Period:一段时间(一次住院疗程) p = pd.Period('2024-01', freq='M') print(p.start_time, '到', p.end_time) # 2024-01-01 00:00:00 到 2024-01-31 23:59:59.999999999 # Timedelta:时长(住院几天) print(pd.Timestamp('2024-01-15') - pd.Timestamp('2024-01-03')) # Timedelta('12 days') # 时区:总部在东京的门店报数过来 tokyo = ts.tz_localize('Asia/Tokyo') print(tokyo.index[:1]) # DatetimeIndex(['2024-01-03 00:00:00+09:00'], dtype='datetime64[ns, Asia/Tokyo]') beijing = tokyo.tz_convert('Asia/Shanghai') print(int(beijing.index[0].hour) - int(tokyo.index[0].hour)) # -1 东京零点对应北京前一天23点

随访档案的建立流程

时间索引建档与随访对齐

时间索引建档与随访对齐

本节要点回顾

  • to_datetime加format是升格正规姿势,脏值coerce后回第03章流程
  • 时间索引切片双闭,字符串'2024-01'整月直取
  • 三种血型:Timestamp是刻、Period是段、Timedelta是差
  • date_range加reindex是缺勤检查的标准组合
  • 时区localize再convert,跨区数据先统一时区再对齐

下一节开始正式复诊:resample重采样。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U