# 导入包
import pandas as pd
import datetime
# 10位时间戳长数字-精确到秒
df = pd.DataFrame({
'create_time': [1490195826, 1590195905, 1591206212]
})
df['create_time_2'] = pd.to_datetime(df['create_time'], unit='s')
df
create_time | create_time_2 | |
---|---|---|
0 | 1490195826 | 2017-03-22 15:17:06 |
1 | 1590195905 | 2020-05-23 01:05:05 |
2 | 1591206212 | 2020-06-03 17:43:32 |
# 13位时间戳长数字-精确到毫秒
df = pd.DataFrame({
'create_time': [1490195826562, 1590195905523, 1591206212486]
})
df['create_time_2'] = pd.to_datetime(df['create_time'], unit='ms')
df
create_time | create_time_2 | |
---|---|---|
0 | 1490195826562 | 2017-03-22 15:17:06.562 |
1 | 1590195905523 | 2020-05-23 01:05:05.523 |
2 | 1591206212486 | 2020-06-03 17:43:32.486 |
# 16位时间戳长数字-精确到微秒
df = pd.DataFrame({
'create_time': [1490195826562956, 1590195905523421, 1591206212486365]
})
df['create_time_2'] = pd.to_datetime(df['create_time'], unit='us')
df
create_time | create_time_2 | |
---|---|---|
0 | 1490195826562956 | 2017-03-22 15:17:06.562956 |
1 | 1590195905523421 | 2020-05-23 01:05:05.523421 |
2 | 1591206212486365 | 2020-06-03 17:43:32.486365 |
# 19位时间戳长数字-精确到纳秒
df = pd.DataFrame({
'create_time': [1490195826562956523, 1590195905523421653, 1591206212486365475]
})
df['create_time_2'] = pd.to_datetime(df['create_time'], unit='ns')
df
create_time | create_time_2 | |
---|---|---|
0 | 1490195826562956523 | 2017-03-22 15:17:06.562956523 |
1 | 1590195905523421653 | 2020-05-23 01:05:05.523421653 |
2 | 1591206212486365475 | 2020-06-03 17:43:32.486365475 |
df = pd.DataFrame({
'create_time': ['20220808', '2022-05-06', '2022/7/9', '2021-10-23 13:20:23']
})
df['create_time_2'] = pd.to_datetime(df['create_time'], infer_datetime_format=True)
df
create_time | create_time_2 | |
---|---|---|
0 | 20220808 | 2022-08-08 00:00:00 |
1 | 2022-05-06 | 2022-05-06 00:00:00 |
2 | 2022/7/9 | 2022-07-09 00:00:00 |
3 | 2021-10-23 13:20:23 | 2021-10-23 13:20:23 |
当我们需要将目标值转成日期时间类型时,那我们就使用 pandas.to_datetime() 方法,该方法详细文档见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html
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)
其中比较重要的参数是 infer_datetime_format=False, errors='raise', format=None 这3个。设置infer_datetime_format=True就能智能识别输入格式并转换成日期时间类型,该方法能够覆盖日常绝大多数情况。如果infer_datetime_format不能帮助我们,那我们就需要根据原始值设置format参数。errors参数用于处理目标值无法解析成日期时间的情况,errors='raise'无法解析时就报错,errors='coerce'无法解析时赋值为空值NaT,errors='coerce'无法解析时赋值为原始值。
df = pd.DataFrame({
'create_time': [datetime.datetime.now(), datetime.datetime.today() - datetime.timedelta(days=3, seconds=1000)]
})
df['create_time_2'] = df['create_time'].dt.strftime('%Y-%m-%d')
df['create_time_3'] = df['create_time'].dt.strftime('%Y-%m')
df
create_time | create_time_2 | create_time_3 | |
---|---|---|---|
0 | 2022-08-14 15:59:04.327855 | 2022-08-14 | 2022-08 |
1 | 2022-08-11 15:42:24.327856 | 2022-08-11 | 2022-08 |
当我们需要将日期时间类型转成字符串类型时,那我们就使用 Series.dt.strftime() 方法来实现。
# 往前推3天
df = pd.DataFrame({
'create_date': pd.date_range('2022-07-29', end='2022-08-03')
})
df['create_date_bef_3_day'] = df['create_date'] - datetime.timedelta(days=3)
df
create_date | create_date_bef_3_day | |
---|---|---|
0 | 2022-07-29 | 2022-07-26 |
1 | 2022-07-30 | 2022-07-27 |
2 | 2022-07-31 | 2022-07-28 |
3 | 2022-08-01 | 2022-07-29 |
4 | 2022-08-02 | 2022-07-30 |
5 | 2022-08-03 | 2022-07-31 |
# 往前推3个月
df = pd.DataFrame({
'create_date': pd.date_range('2022-07-29', end='2022-08-03')
})
df['create_date_bef_3_month'] = df['create_date'] - pd.DateOffset(months=3)
df
create_date | create_date_bef_3_month | |
---|---|---|
0 | 2022-07-29 | 2022-04-29 |
1 | 2022-07-30 | 2022-04-30 |
2 | 2022-07-31 | 2022-04-30 |
3 | 2022-08-01 | 2022-05-01 |
4 | 2022-08-02 | 2022-05-02 |
5 | 2022-08-03 | 2022-05-03 |
# 所在周
df = pd.DataFrame({
'create_date': pd.date_range('2022-07-29', end='2022-08-03')
})
df['create_week'] = df['create_date'].dt.to_period('W').dt.start_time
df
create_date | create_week | |
---|---|---|
0 | 2022-07-29 | 2022-07-25 |
1 | 2022-07-30 | 2022-07-25 |
2 | 2022-07-31 | 2022-07-25 |
3 | 2022-08-01 | 2022-08-01 |
4 | 2022-08-02 | 2022-08-01 |
5 | 2022-08-03 | 2022-08-01 |
# 所在月、所在月的第1天和最后1天
df = pd.DataFrame({
'create_date': pd.date_range('2022-07-29', end='2022-08-03')
})
df['create_month'] = df['create_date'].dt.strftime('%Y-%m')
df['create_month_start'] = df['create_date'].dt.to_period('M').dt.start_time.dt.date
df['create_month_end'] = df['create_date'].dt.to_period('M').dt.end_time.dt.date
df
create_date | create_month | create_month_start | create_month_end | |
---|---|---|---|---|
0 | 2022-07-29 | 2022-07 | 2022-07-01 | 2022-07-31 |
1 | 2022-07-30 | 2022-07 | 2022-07-01 | 2022-07-31 |
2 | 2022-07-31 | 2022-07 | 2022-07-01 | 2022-07-31 |
3 | 2022-08-01 | 2022-08 | 2022-08-01 | 2022-08-31 |
4 | 2022-08-02 | 2022-08 | 2022-08-01 | 2022-08-31 |
5 | 2022-08-03 | 2022-08 | 2022-08-01 | 2022-08-31 |
# 前3个月的第1天和最后1天
df = pd.DataFrame({
'create_date': pd.date_range('2022-07-29', end='2022-08-03')
})
df['bef_3_month_end'] = pd.DatetimeIndex(df['create_date']).shift(-3, freq='M')
df['bef_3_month_start'] = df['bef_3_month_end'].dt.to_period('M').dt.start_time
df
create_date | bef_3_month_end | bef_3_month_start | |
---|---|---|---|
0 | 2022-07-29 | 2022-04-30 | 2022-04-01 |
1 | 2022-07-30 | 2022-04-30 | 2022-04-01 |
2 | 2022-07-31 | 2022-04-30 | 2022-04-01 |
3 | 2022-08-01 | 2022-05-31 | 2022-05-01 |
4 | 2022-08-02 | 2022-05-31 | 2022-05-01 |
5 | 2022-08-03 | 2022-05-31 | 2022-05-01 |
# 时间元素的提取
df = pd.DataFrame({
'create_time': pd.date_range('2022-07-30 10:43:22', periods=3, freq='16H')
})
df['create_date'] = df['create_time'].dt.date
df['create_month1'] = df['create_time'].dt.month
df['create_month2'] = df['create_time'].dt.strftime('%Y-%m')
df['create_year'] = df['create_time'].dt.year
df['create_hour'] = df['create_time'].dt.hour
df
create_time | create_date | create_month1 | create_month2 | create_year | create_hour | |
---|---|---|---|---|---|---|
0 | 2022-07-30 10:43:22 | 2022-07-30 | 7 | 2022-07 | 2022 | 10 |
1 | 2022-07-31 02:43:22 | 2022-07-31 | 7 | 2022-07 | 2022 | 2 |
2 | 2022-07-31 18:43:22 | 2022-07-31 | 7 | 2022-07 | 2022 | 18 |
日期时间的推移主要使用 pandas.DateOffset(), pandas.Series.dt.to_period(), pandas.Series.shift() 这3个方法。其中to_period()方法类似于SQL中的date_trunc()函数,按时间单位(时间频率)进行转换,常用的时间单位主要是 周-W 和 月-M,而shift()方法只支持日期时间类型的索引,使用时需要先将Series转成DatetimeIndex再使用。
# 将时区转换成柏林时间和北京时间
df = pd.DataFrame({
'create_date': pd.date_range("2022-01-01", periods=3, freq="D", tz='UTC')
})
df['create_date_2'] = df['create_date'].dt.tz_convert("Europe/Berlin")
df['create_date_3'] = df['create_date'].dt.tz_convert("Asia/Chongqing")
df
create_date | create_date_2 | create_date_3 | |
---|---|---|---|
0 | 2022-01-01 00:00:00+00:00 | 2022-01-01 01:00:00+01:00 | 2022-01-01 08:00:00+08:00 |
1 | 2022-01-02 00:00:00+00:00 | 2022-01-02 01:00:00+01:00 | 2022-01-02 08:00:00+08:00 |
2 | 2022-01-03 00:00:00+00:00 | 2022-01-03 01:00:00+01:00 | 2022-01-03 08:00:00+08:00 |
# 查看时区枚举值
import pytz
timezones = sorted(list(pytz.all_timezones_set))
[tz for tz in timezones if 'Berlin' in tz]
['Europe/Berlin']
当我们需要做时区转换时,那我们就使用 Series.dt.tz_convert() 方法来实现,时区枚举值可以通过pytz.all_timezones_set查看。