2025年Python----时间模块

Python----时间模块1 计算昨天 明天的日期 from datetime import datetime timedelta now datetime now print now yestoday now timedelta days 1 print yestoday tommorow now

大家好,我是讯享网,很高兴认识大家。

1.计算昨天,明天的日期

from datetime import datetime,timedelta now = datetime.now() print(now) yestoday = now - timedelta(days=1) print(yestoday) tommorow = now + timedelta(days=1) print(tommorow) next_year = now + timedelta(days = 365) print(next_year) last_year = now - timedelta(days = 365) print(last_year) 

讯享网
讯享网2019-03-30 15:29:58. 2019-03-29 15:29:58. 2019-03-31 15:29:58. 2020-03-29 17:08:25. 2018-03-30 17:08:25. 

2.三大模块之—time

参考:https://www.jianshu.com/p/a035a564b248
time点time得秒数
传入gm, local time得struct_time
要想变回原秒数
你得传回calendar.timegm和time. mktime
string f和string p格式化时间靠哥俩
你要还是嫌费事
asctime ,ctime来助力
专门帮你转字符串
前者接收struct_time
后者专门处理秒数
分工合作不费力
学好time模块基本功
做个时间的明白人!

3.python时间格式的相互转换

常用的日期数据格式主要有三种
datetime.datetime
str
datetime.date
时间数据格式之间的相互转换

import datetime datetime.date.today() 》》datetime.date(2019, 4, 1) type(datetime.date.today()) 》》datetime.date 

(1)datetime.datetime 转str:

讯享网from datetime import datetime b = datetime.now().strftime('%Y-%m-%d') 

(2)str 转datetime.datetime

d = datetime.strptime(b, '%Y-%m-%d') # strptime()内参数必须为string格式 

为了方便把它写进一个函数里

讯享网# 将str类型的日期转成datetime.datetime def string_toDatetime(st): return datetime.datetime.strptime(st, "%Y-%m-%d") 
 e = datetime.date(d) # date()内参数需要datetime.datetime型 

(4)datetime.date转str

讯享网 h = str(e) 

4.获取前一个月的日期

参考:https://www.cnblogs.com/jl-bai/p/5505971.html

import datetime from dateutil.relativedelta import relativedelta a = datetime.date.today() a 》》datetime.date(2019, 4, 1) b = datetime.date.today() - relativedelta(months=+1) b 》》datetime.date(2019, 3, 1) type(a) 》》datetime.date type(b) 》》datetime.date 

5.再来看看强大的relativedelta

由于项目需要,主要用来计算对应上一年的对应日期,顺便总结了其他的情况。
from dateutil.relativedelta import relativedelta
import datetime
首先日期如下面的格式

讯享网》》dates 2018-12-29 2018-12-28 2018-12-27 2018-12-26 2018-12-25 2018-12-24 2018-12-23 2018-12-21 

由于生成的日期是str类型,需要转成datetime.datetime.date类型,所以定义一个函数


讯享网

# 将str类型的日期转成datetime.datetime def string_toDatetime(st): return datetime.datetime.strptime(st, "%Y-%m-%d") 
讯享网for i in dates: print(i) # 当前日期 print(type(i)) # 当前日期的类型 print(str(string_toDatetime(i).date() - relativedelta(months=1,days=1))) # 对应上个月的前一天 print(str(string_toDatetime(i).date() - relativedelta(day=1))) # 对应本月一号,# 不加s则是绝对 print(str(string_toDatetime(i).date() - relativedelta(days=1))) # 对应前一天 # 加s则是相对第几天 print(str(string_toDatetime(i).date() - relativedelta(month=1))) # 对应将月改为一月(绝对) print(str(string_toDatetime(i).date() - relativedelta(months=1))) # 对应前一个月 print(str(string_toDatetime(i).date() - relativedelta(year=2017))) # 将年改为指定的年 print(str(string_toDatetime(i).date() - relativedelta(years=1))) # 对应前一年 

好了,看一下其中一个的打印结果吧

2018-12-29 <class 'str'> 2018-11-28 2018-12-01 2018-12-28 2018-01-29 2018-11-29 2017-12-29 2017-12-29 

6. DataFrame计算两列时间差,是否满足六个月

讯享网def fun(x): days = datetime.timedelta(days=180) # 定义一个时间天数180天,,是时间类型的,输入的也是个时间类型的天数啊。 if x < days: # 为什么用小于?--->因为里面有空值,还是时间类型的。 return "是" else: return "否" data_es['新开店'] = pd.to_datetime(data_es['时间']) - pd.to_datetime(data_es['办证时间']) # 相减后的时间类型type 'Timedelta' data_es['新开店'] = data_es['新开店'].apply(lambda x: fun(x)) 

7.去掉时间列的时分秒

 编号 创建日期 0 2212 2019-01-08 16:12:39 1 1428 2019-01-08 12:30:12 2 2226 2019-01-08 12:18:28 3 1448 2019-01-08 10:40:12 4 2226 2019-01-08 08:41:57 
讯享网from datetime import datetime data['创建日期'] = pd.to_datetime(data['创建日期']).dt.normalize() 
 编号 创建日期 0 2212 2019-01-08 1 1428 2019-01-08 2 2226 2019-01-08 3 1448 2019-01-08 4 2226 2019-01-08 

8、读取某一天的全部数据

方法一:将时间列转为str类型

讯享网data1 = Data[Data['时间'] == '2019-06-01'] # 这里将时间转为str是因为 '2019-06-01'是字符串格式,只有将时间列转为str才能进行判断和选择 

方法二:先设置索引,再进行选择。

Data = Data.set_index('时间') # 将时间列设置为index data1 = Data['2019-06-01':'2019-06-01'] 

对索引进行排序:

讯享网Data.sort_index(inplace=True) 

9、根据条件读取一段时间的数据

这里有两种方法,第一种是将时间设置为索引列index,然后,通过索引进行选取一个时间段的数据(DataFrame)。
第二种方法是将时间列中的时间用字符串表示,选取某一范围进行比较,得出这段时间的数据。
直接来一段代码吧。
第一种方法:(设置索引)

场景分析,这里需要对ea_data,(一个DataFrame)增加一列数据,是根据df1的每行时间和ID,去另一个DataFrame,即cp_data中,计算该ID对应的前一年出现的次数。

ea_data, cp_data = get_data(exam_path, cplain_path_1, cplain_path_2) cp_data['创建日期'] = pd.to_datetime(cp_data['创建日期']).dt.normalize() cp_data.set_index('创建日期', inplace=True) # 将cp_data时间列设置为索引 print(cp_data) ea_data['ID次数'] = ea_data.apply(lambda row: my_test(row['时间'], row['ID'], cp_data), axis=1) # ea_data按行对数据(该行ID号在cp_data数据中的个数)进行处理,即在ea_data中新增一列,对每一行进行调用函数my_test() # 这里a是该行的时间,即row['时间'],b是ID,即row['ID'], def my_test(a, b, cp_data): a = a.strftime('%Y-%m-%d') # 将昨天的日期格式转为str date = datetime.datetime.strptime(a, "%Y-%m-%d") t = date - relativedelta(years=1) # 对应前一年的时间 df = cp_data.loc[a:t].reset_index() # 对应前一年的数据 # print(df) try: # ea_data中ID可能不在cp_data数据中,会报错 n = df.groupby(['ID']).size()[b] # 统计列里某值(这里是ID)出现的次数 except: n = 0 return n 

方法2:

讯享网def data_cores(save_ilg_path, save_cores_path): all_data = pd.read_excel(save_ilg_path, sheet_name=0, encoding='gbk') all_data['时间'] = pd.to_datetime(all_data['时间']) Df = all_data all_data['月得分'] = all_data.apply(lambda row: my_test1(row['时间'], row['写作次数'], row['阅读次数'],row['娱乐次数'],Df), axis=1) all_data.to_excel(save_cores_path) def my_test1(a, c, d, e, Df): # 本月得分为 n = c + 2*d + e a = a.strftime('%Y%m%d') # 将昨天的日期格式转为str print(a) date = datetime.datetime.strptime(a, "%Y%m%d") p = date - relativedelta(months=1) # 对应前一个月的时间 p = p.strftime('%Y%m%d') print(p) t = date - relativedelta(months=6) # 对应前半年的时间 t = t.strftime('%Y%m%d') print(t) print("") df = Df[(Df['时间'] >= pd.to_datetime(t)) & (Df['时间'] <= pd.to_datetime(p))] 

第二种方法中关键的是:

 all_data['时间'] = pd.to_datetime(all_data['时间']) df = Df[(Df['时间'] >= pd.to_datetime(t)) & (Df['时间'] <= pd.to_datetime(p))] 

10、dt对象的使用

提取dataframe时间列,Series数据类型:datetime

讯享网Series.dt.day_name():从日期判断出所处星期数; Series.dt.quarter:从日期判断所处季节; Series.dt.is_year_end:从日期判断是否处在年底; 
小讯
上一篇 2025-03-08 22:04
下一篇 2025-01-18 11:43

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/31222.html