Pandas时间序列与日期





使用注意:Pandas用NaT表示日期时间、时间差及时间段的空值,类似NaN

1、日期序列:date_range()


Pandas生成日期序列详见文章:传送门

2、时间戳:pd.Timestamp()

# 日期计算:支持多种字符串类型如:20230501、2023-5-1、2023-05-01、2023/5/1、2023/05/01等
day = pd.Timestamp('20230501')
day = pd.Timestamp(2023, 5, 1)    # 类似datetime.datetime()
# 星期
print(day.day_name())     # Monday
# 月
print(day.month_name())   # May
# 获取年份、月份、天
print(day.year)           # 2023
print(day.month)          # 5
print(day.day)            # 1

# 其他Timestamp可以访问的日期/时间属性成员
'''
属性                        描述
year                       返回datetime的年
month                      返回datetime的月
day                        返回datetime的日
hour                       返回datetime的小时
minute                     返回datetime的分钟
second                     返回datetime的秒
date                       返回datetime.date(不包含时区信息)
time                       返回datetime.time(不包含时区信息)
timetz                     返回带本地时区信息的datetime.time
dayofyear                  一年里的第几天
week/weekofyear            一年里的第几周
weekday/dayofweek          一周里的第几天(Monday=0,Sunday=6)
quarter                    返回该天所处的季节(Jan-Mar=1,Apr-Jun=2等)
days_in_month              返回该天所在月有多少天
is_month_start             是否月初(由频率定义,下同)
is_month_end               是否月末
is_quarter_start           是否季初
is_quarter_end             是否季末
is_year_start              是否年初
is_year_end                是否年末
is_leap_year               是否闰年
'''
ts = pd.Timestamp('2023-05-01 08:00:00', tz='Asia/Shanghai')
print(ts.timetz())         # 08:00:00
print(ts.date())           # 2023-05-01
print(ts.is_month_start)   # True

3、时间段:pd.Period()

# freq: Y显示到年 M显示到月 D显示到天
# 仅支持yyyy-MM-dd hh:mm:ss格式
print(pd.Period('2023-05-20', freq='M'))    # 2023-05
print(pd.Period('2023-05'))                 # 2023-05
print(pd.Period('2023-05', freq='D'))       # 2023-05-01

4、转换时间戳:to_datetime()

'''
to_datetime(str,format,dayfirst,unit)
'''
# 用于转换字符串、纪元式及混合日期时间的Series或列表
print(pd.to_datetime('Jul 10, 2023'))       # 2023-07-10 00:00:00
print(pd.to_datetime('2023/07/10'))         # 2023-07-10 00:00:00
print(pd.to_datetime('2023.07.10'))         # 2023-07-10 00:00:00

# 解析欧式日期(日-月-年):使用参数:dayfirst
print(pd.to_datetime('01-07-2023', dayfirst=True))    # 2023-07-01 00:00:00

# 其他类型解析
print(pd.to_datetime('Sat, Apr, 15 2023 23:01:52'))   # 2023-04-15 23:01:52
print(pd.to_datetime('5/20/2023'))                    # 2023-05-20 00:00:00
print(pd.to_datetime('15 Oct, 2023 8:10am'))          # 2023-10-15 08:10:00

# 纪元(unix)时间戳转换 unit:单位(s或ms)
print(pd.to_datetime(1694593035, unit='s'))  # 2023-09-13 08:17:15

# format:仅用于加快转换速度
print(pd.to_datetime('2023-07-10', format='%Y-%m-%d'))

5、多列组合日期时间

df = pd.DataFrame({'year': [2022, 2023], 'month': [5, 6], 'day': [9, 10]})
print(df.to_string())
print(pd.to_datetime(df[['year', 'month', 'day']]))
'''
0   2022-05-09
1   2023-06-10
dtype: datetime64[ns]
'''

6、偏移日期时间:pd.DateOffset()

# DateOffset对象用于计算日历日时间偏移日期时间,类似dateutil.relativedelta
# 对应日历日时间
print(ts + pd.DateOffset(days=1))      # 2023-05-02 08:00:00+08:00
# 对应绝对时间
print(ts + pd.Timedelta(days=1))       # 2023-05-02 08:00:00+08:00
# 参数偏移
print(ts + pd.offsets.Week())          # 2023-05-08 08:00:00+08:00

7、时区处理、时区转换

# 1)时区处理
# 利用pytz与datetuil或标准库datetime.timezone对象,Pandas能以多种方式处理不同时区的时间戳
'''
pytz:tz='Asia/Shanghai'
dateutil:tz=dateutil.tz.tzutc()
datetime:tz=datetime.timezone.utc
'''
import dateutil
import datetime

dft = pd.DataFrame({'dt': pd.date_range('20221001', periods=5, freq='MS', tz=datetime.timezone.utc), 'v': np.random.randn(5).round(2)*10})
print(dft.to_string())
'''
                         dt     v
0 2022-10-01 00:00:00+00:00   6.4
1 2022-11-01 00:00:00+00:00   1.0
2 2022-12-01 00:00:00+00:00   5.1
3 2023-01-01 00:00:00+00:00   2.6
4 2023-02-01 00:00:00+00:00  25.3
'''

# 2)时区转换
# 方式1:tz_convert()
# 注意:DataFrame需要将日期时间列设置为索引,Series需要设置日期时间索引
print(dft.set_index('dt').tz_convert('US/Eastern').reset_index())
'''
                         dt     v
0 2022-09-30 20:00:00-04:00   6.4
1 2022-10-31 20:00:00-04:00   1.0
2 2022-11-30 19:00:00-05:00   5.1
3 2022-12-31 19:00:00-05:00   2.6
4 2023-01-31 19:00:00-05:00  25.3
'''
# 方式2:astype()
dft['dt'] = dft['dt'].astype('datetime64[ns, Asia/Shanghai]')
print(dft.to_string())
'''
                         dt     v
0 2022-10-01 08:00:00+08:00   6.4
1 2022-11-01 08:00:00+08:00   1.0
2 2022-12-01 08:00:00+08:00   5.1
3 2023-01-01 08:00:00+08:00   2.6
4 2023-02-01 08:00:00+08:00  25.3
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值