# 时间格式数据处理

这个版块很重要，但是每次都记不住，主要从类库分别记录

## `datetime`类库

### 构造时间数据对象

*   直接构建

    ```python
    datetime.date(2019,8,26)
    ```
*   获取今天的时间

    ```python
    datetime.date.today()
    ```
*   取指定时间部分

    ```python
    a = datetime.date.today()
    a.year # 年
    a.month # 月
    a.day # 日
    ```

### `str`格式转换

将`str`格式转为时间，随即可以进行仅时间格式可进行的操作

*   `str`转时间

    ```python
    datetime.strptime(str,'%H:%M:%S.%f')
    datetime.strptime(str,'%Y-%m-%d')
    ```
*   时间转`str`

    ```python
    datetime.strftime(str,'%H:%M:%S.%f')
    ```

### 时间间隔`timedelta`

*   两时间加减

    ```
    a1 = datetime.date(2019,8,26)
    a2 = datetime.date(2019,9,26)
    (a2 - a1).days # <- datetime.timedelta(31)
    (a1 - a2).days # <- 31
    ```

`.seconds`表示将此间隔转为秒为单位

*   处理间隔

    ```python
    a1 = datetime.date(2019,8,26)
    delta = datetime.timedelta(days=10)
    a1 + delta # <- datetime.date(2019, 9, 5)
    (a1 + delta).isoformat() # <- '2019-09-05'
    (a1 + delta).strftime('%Y-%m-%d') # <- '2019-09-05'
    ```

### 生成等间距时间序列

```python
pd.date_range(start=self.beginDate, end=self.endDate, freq='Q').strftime('%Y%m%d').tolist()
```

显然其中`freq`参数控制间隔为季度

## `pandas`中的时间处理

### `to_datetime`：`str`转时间戳

将某列数据，进行格式化，转换为时间格式

```python
pd.to_datetime('20221101',format='%Y%m%d') # <- Timestamp('2022-11-01 00:00:00')
pd.to_datetime(20221101,format='%Y%m%d') # <- Timestamp('2022-11-01 00:00:00')
pd.to_datetime('2022-11-1',format='%Y-%m-%d') # <- Timestamp('2022-11-01 00:00:00')
```

### `pandas.tseries.offsets`：跳转

这部分主要是基于时间戳，获取符合条件的时间，举例说明

*   转至月末

    ```python
    pd.Timestamp('2017-01-01 09:10:11') + pd.tseries.offsets.MonthEnd(1)
    ```
*   前五年的今天

    ```python
    pd.to_datetime('2022-11-1') - pd.DateOffset(years=5) # <-Timestamp('2017-11-01 00:00:00')
    ```

### `pandas.Series.dt`：批量操作

对`pandas.Series`中的每一个时间戳对象，进行批量操作，类似于`apply`

```python
AnalystConsData['writeDate_shift1D'].dt.strftime('%Y-%m-%d') # 时间戳批量转回str
```

## _Datetime format specification_

![image-20230224145321242](https://euclid-picgo.oss-cn-shenzhen.aliyuncs.com/image/202302241453303.png)
