Pandas时间类型数据处理常用方法小结

在数据处理、特征工程时,往往需要按照时间段来统计特征,例如计算间隔天数、最近一个月、最近3个月、最近半年、最近一年某用户的行为数据,那么如何计算筛选这些时间点呢?下面就来介绍一些常用的方法。

首先,创建个模拟数据集。

import pandas as pd
import datetime

df = pd.DataFrame({'sport':['青岛','哈尔滨','北京'],
                   'date':pd.to_datetime(['2021-05-04 07:30:00','2021-08-29 07:30:00','2021-10-31 07:30:00'])})
df

sportdate0青岛2021-05-04 07:30:001哈尔滨2021-08-29 07:30:002北京2021-10-31 07:30:00

1.1. 时间转字符串

df['datestr']=df['date'].dt.strftime('%Y-%m-%d')
print(df.dtypes)
df
sport              object
date       datetime64[ns]
datestr            object
dtype: object

sportdatedatestr0青岛2021-05-04 07:30:002021-05-041哈尔滨2021-08-29 07:30:002021-08-292北京2021-10-31 07:30:002021-10-31

dt.year、dt.month、dt.day、dt.hour、dt.minute、dt.second、dt.week (dt.weekofyear和dt.week一样)分别返回日期的年、月、日、小时、分、秒及一年中的第几周

首先,通过DataFrame的astype,直接把日期转换为字符串。

df['datestr']=df['date'].astype(str)
df

sportdatedatestr0青岛2021-05-04 07:30:002021-05-04 07:30:001哈尔滨2021-08-29 07:30:002021-08-29 07:30:002北京2021-10-31 07:30:002021-10-31 07:30:00

使用str方法截断字符串。

df['datestr'] = df['datestr'].str[0:10]
df

sportdatedatestr0青岛2021-05-04 07:30:002021-05-041哈尔滨2021-08-29 07:30:002021-08-292北京2021-10-31 07:30:002021-10-31

1.2. 时间字符串转为时间格式

使用”astype”,把字符串类型强制转换为时间数据。

DataFrame.astype(dtype, copy=True, errors=’raise’)[source]

df['days'] = '20211117'
df['daytime'] = '20211117 12'
df['datestr'] = df['datestr'].astype('datetime64')
df['days'] = df['days'].astype('datetime64')
df['daytime'] = df['daytime'].astype('datetime64')

df

sportdatedatestrdaysdaytime0青岛2021-05-04 07:30:002021-05-042021-11-172021-11-17 12:00:001哈尔滨2021-08-29 07:30:002021-08-292021-11-172021-11-17 12:00:002北京2021-10-31 07:30:002021-10-312021-11-172021-11-17 12:00:00

1.3. 使用dt分别取年、季度、月、日、周等

df = df.drop(['datestr','days','daytime'],axis=1)
df['year']= df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['quarter'] = df['date'].dt.quarter
df['week'] = df['date'].dt.isocalendar().week
df['weekday'] = df['date'].dt.weekday
df['yearmonth'] = df['date'].dt.strftime('%Y%m')
df['initdate']=df['date'].astype('int64')
df

注:周一为数字0。

sportdateyearmonthdayquarterweekweekdayyearmonthinitdate0青岛2021-05-04 07:30:00202154218120210516201134000000000001哈尔滨2021-08-29 07:30:002021829334620210816302222000000000002北京2021-10-31 07:30:002021103144362021101635665400000000000

1.4. 时间的加减计算

DateOffset 基础操作类似于 dateutil.relativedelta(relativedelta 文档),可按指定的日历日时间段偏移日期时间。可用算数运算符(+)或 apply 方法执行日期偏移操作。

Parameters that add to the offset (like Timedelta):

  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds
  • microseconds
  • nanoseconds
from pandas.tseries.offsets import *

df['datestr'] = df['datestr'] + DateOffset(months=1)

df['days'] = df['days'] + DateOffset(days=10)
df['daytime'] = df['daytime'] + DateOffset(years=1)
df

sportdatedatestrdaysdaytime0青岛2021-05-04 07:30:002021-06-042021-11-222022-11-02 12:00:001哈尔滨2021-08-29 07:30:002021-09-292021-11-222022-11-02 12:00:002北京2021-10-31 07:30:002021-11-302021-11-222022-11-02 12:00:00

datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象。

datetime.timedelta(weeks=0, days=0, hours=0, minutes=0, second=0, microsecond=0, milliseconas=0)
参数默认为0。


df['days'] = df['days'] - datetime.timedelta(days=5)
df['daytime'] = df['daytime'] + datetime.timedelta(days=-15)
df

sportdatedatestrdaysdaytime0青岛2021-05-04 07:30:002021-05-042021-11-122021-11-02 12:00:001哈尔滨2021-08-29 07:30:002021-08-292021-11-122021-11-02 12:00:002北京2021-10-31 07:30:002021-10-312021-11-122021-11-02 12:00:00

1.5. DataFrame两行间的时间差

DataFrame.diff(periods=1, axis=0)

df['days'] = df['date'].diff().dt.days
df

sportdatedatestrdaysdaytime0青岛2021-05-04 07:30:002021-06-04NaN2022-11-02 12:00:001哈尔滨2021-08-29 07:30:002021-09-29117.02022-11-02 12:00:002北京2021-10-31 07:30:002021-11-3063.02022-11-02 12:00:00

1.6. 整型数字转时间

由于某种原因,把时间保存为yyyymmdd格式的数值,例如:20211119等,转换为时间的方法:


data['intday'] = 20211118
data['intday'] =data['intday'].astype('str')
print(data)
data['intday'] =data['intday'].astype('datetime64[ns]')
data
   data_time       date    intday
0 2020-10-01 2019-01-31  20211118
1 2020-10-02 2019-02-28  20211118
2 2020-10-03 2019-03-31  20211118

data_timedateintday02020-10-012019-01-312021-11-1812020-10-022019-02-282021-11-1822020-10-032019-03-312021-11-18

pandas 时间序列之pd.date_range()。用于生成一个固定频率的DatetimeIndex时间索引。原型:
date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)

  • 常用参数为start、end、periods、freq。
    start:指定生成时间序列的开始时间
    end:指定生成时间序列的结束时间
    periods:指定生成时间序列的数量
    freq:生成频率,默认’D’,可以是’H’、’D’、’M’、’5H’、’10D’、…

还可以根据closed参数选择是否包含开始和结束时间,left包含开始时间,不包含结束时间,right与之相反。默认同时包含开始时间和结束时间。
* 函数调用时至少要指定参数start、end、periods中的两个。

https://www.tutorialspoint.com/python_pandas/python_pandas_date_functionality.htm

AliasDescriptionAliasDescriptionBbusiness day frequencyBQSbusiness quarter start frequencyDcalendar day frequencyAannual(Year) end frequencyWweekly frequencyBAbusiness year end frequencyMmonth end frequencyBASbusiness year start frequencySMsemi-month end frequencyBHbusiness hour frequencyBMbusiness month end frequencyHhourly frequencyMSmonth start frequencyT, minminutely frequencySMSSMS semi month start frequencySsecondly frequencyBMSbusiness month start frequencyL, msmillisecondsQquarter end frequencyU, usmicrosecondsBQbusiness quarter end frequencyNnanosecondsQSquarter start frequency

data = pd.DataFrame({'data_time':pd.date_range('2020-10-01 00:00:00',periods = 3,freq = 'D'),
                     'date':pd.date_range('2019-01-01',periods = 3,freq = 'M')})
data

data_timedate02020-10-012019-01-3112020-10-022019-02-2822020-10-032019-03-31

初始化起止时间应用案例:


def init_date_rage(startday='2019-01-01',endday = '2019-01-31', period = 3):
    data = pd.DataFrame({'startday':pd.date_range(startday,periods = period,freq = 'MS'),
                         'endday':pd.date_range(endday,periods = period,freq = 'M')})
    data['yearmonth'] = data['startday'].dt.strftime('%Y%m')
    data['startday'] = data['startday'].dt.strftime('%Y-%m-%d')
    data['endday'] = data['endday'].dt.strftime('%Y-%m-%d')

    params = data[['startday','endday','yearmonth']].values.tolist()

    return params
input_params = init_date_rage()
input_params
[['2019-01-01', '2019-01-31', '201901'],
 ['2019-02-01', '2019-02-28', '201902'],
 ['2019-03-01', '2019-03-31', '201903']]

timedelta 对象表示两个 date 或者 time 的时间间隔。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

https://docs.python.org/zh-cn/3/library/datetime.html

在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。

  • class datetime.date
    一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。 属性: year, month, and day。
  • class datetime.time
    一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 24 _60_60 秒。 (这里没有”闰秒”的概念。) 包含属性: hour, minute, second, microsecond 和 tzinfo。
  • class datetime.datetime
    日期和时间的结合。属性:year, month, day, hour, minute, second, microsecond, and tzinfo.

  • class datetime.timedelta
    表示两个 date 对象或 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。

  • class datetime.tzinfo
    一个描述时区信息对象的抽象基类。 用来给 datetime 和 time 类提供自定义的时间调整概念(例如处理时区和/或夏令时)。
  • class datetime.timezone
    一个实现了 tzinfo 抽象基类的子类,用于表示相对于 世界标准时间(UTC)的偏移量。
  • Python 日历模块calendar.monthrange 获取某一个月有多少天
    输出的是一个元组;
    第一个元素,数字0是这个月第一天的星期码(0星期一,6星期天);
    第二个元素,数字31是这个月的天数;

3.1. 取月末最后一天

import calendar

last_day = calendar.monthrange(2020, 5)
print(last_day)
last_day = calendar.monthrange(2020, 5)[1]
print(last_day)
(4, 31)
31

from datetime import datetime,date
import calendar

today = date.today()
print(today)
today = str(today)
month_first=datetime.strptime(today[:8]+'01','%Y-%m-%d')
print(month_first)
year = int(today[:4])
month = int(today[5:7])
month_end=datetime.strptime(today[:8]+str(calendar.monthrange(year, month)[1]),'%Y-%m-%d')

print(month_end)
2021-11-18
2021-11-01 00:00:00
2021-11-30 00:00:00

3.2. 取今天时间


to_day = str(datetime.date.today())[:10]
to_day
'2021-11-18'

3.3. 写操作日志应用,记录时间

由于前文,以及使用了date.today(),接下来换成time.localtime()。

import time

def writelog(fielname,env,msg):

    logtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    fp = open(fielname,'a+')
    fp.write(logtime + ' : '+ env + '\n')
    fp.write('  '+ msg + '\n')
    fp.close()
writelog('log.txt','test','hello2')

Original: https://blog.csdn.net/xiaoyw/article/details/121356945
Author: 肖永威
Title: Pandas时间类型数据处理常用方法小结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/753485/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • python–飞机大战

    项目名称:python飞机大战编程语言:python用到关键知识:pygame模块,python基础,os文件读写,以及面向对象思想方法!实现功能:1:飞机的移动,发射子弹,手雷,…

    Python 2023年8月12日
    049
  • 谈谈自己的理解:python中闭包,闭包的实质.

    如果我们在一个函数的内部定义另一个函数,我们在外部称为外部函数,在内部称为内部函数。 [En] If we define another function on the insid…

    Python 2023年5月25日
    066
  • python代码正方形_如何使用matplotlib使标记方格成为精确的正方形?

    首先,重要的是我要用散开而不是通过迭代点(补丁),因为我的真实数据有大量的数据点。问题是如何用散开找到合适的标记大小。在 我想通过以下例子实现:对于我的16个数据点中的每一个,图片…

    Python 2023年9月5日
    043
  • DRF二级视图GenericAPIView

    GenericAPIView GenericAPIView继承自APIView,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。 …

    Python 2023年8月5日
    083
  • 组装三角形

    牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同…

    Python 2023年5月24日
    0111
  • scrapy的各个模块的作用以及数据在从各个模块的流向

    scrapy的各个模块的作用以及数据在从各个模块的流向 ​ 引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心 ​ 项目、它定义了爬取的结果的数据结构,爬取的数据会被赋值成…

    Python 2023年10月3日
    057
  • 送福利啦~70个python练手项目,实践中检验真知‼ 免费领取

    嗨!粉丝们,我好像很长时间没给大家送福利啦嘿嘿主要是最近一直很忙,这不一闲下来就给大家及时送福利了! 不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦!这里整…

    Python 2023年9月25日
    044
  • Pandas使用unstack()行转列时报错:Index contains duplicate entries, cannot reshape

    stack()即”堆叠”,作用是将列旋转到行unstack()即stack()的反操作,将行旋转到列 unstack(): Series对象的API,用于将…

    Python 2023年8月7日
    048
  • numpy库的使用

    numpy库的使用 1、numpy简介 多维数组库,创建多维数组很方便,可以替代多维列表 速度比多维列表快 支持向量和矩阵的各种数学运算 所有元素类型必须相同 pip3 insta…

    Python 2023年8月25日
    070
  • python笔记—>贪吃蛇游戏制作

    1、安装需要的库pygame Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的…

    Python 2023年9月17日
    057
  • Nginx与LUA(6)

    您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏”兔”,有钱”兔”,多…

    Python 2023年11月5日
    035
  • 基于深度神经网络的中药材识别

    摘 要 近年来,受到我国国民经济发展与社会财富积累增速加快的影响,人们对自己的身体健康也越来越重视,很多的人都选择在服用中草药来治疗疾病、改善体质,因此,我国的中药材行业在这一段时…

    Python 2023年9月29日
    060
  • Swin UNETR: Swin Transformers for Semantic Segmentation of Brain Tumors in MRI Images

    摘要 卷积神经网络因为其卷积核的固有属性,其在远程建模方面存在着较大的问题。这可能导致对可变大小的肿瘤进行分割时存在不足。另一方面,Transformer在多个领域在捕获远程依赖信…

    Python 2023年10月26日
    032
  • 注意力机制——CAM、SAM、CBAM、SE

    CAM、SAM、CBAM详见:CBAM——即插即用的注意力模块(附代码) 目录 1.什么是注意力机制? 2.通道注意力机制——SE (1)Squeeze (2)Excitation…

    Python 2023年8月2日
    067
  • 乐高玩具数据分析

    一、选题的背景 (1)为什么要选择此选题? 乐高是一个很受欢迎的玩具积木品牌,它们通常是成套出售的,用来制作特定的物品,每一套都包含许多不同形状、大小和颜色的零件。它是一个有趣的数…

    Python 2023年10月30日
    067
  • 如何向mongoDB中添加新的字段附代码(全)

    本身MongoDB的连接就和Mysql的数据库一样Mysql连接方式:mysql -u -root -p(标准模式下)MongoDB类似:mongo -u root -p 之所以要…

    Python 2023年8月6日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球