datetime判断日期不要时间_pandas日期字段处理日期和字符串之间转化,日期提取与计算...

在做数据处理的过程,包括数据过滤、数据汇总计算等都会经常用到pandas从日期属性中提取年月日。pandas做数据处理分析也不例外。

4227df7fec5d3edf6cf1f82c9ac17ce9.png

一、获取数据

import numpy as npimport pandas as pdimport pymysqlimport warningswarnings.filterwarnings("ignore")#查看某个函数、方法的详细使用。如输入pd.read_csv,然后按shift+tab(4次)#连接数据库(mysql)con = pymysql.connect(host = '127.0.0.1',port=3306,                     user='root',passwd='131129',db='znf',                      use_unicode=True,charset='utf8')# 查询数据sql = '''SELECT              产品编号,            单位,            规格,            售价,            是否赠品,            创建时间        FROM             在售产品; '''# 执行查询df = pd.read_sql_query(sql,con = con)#随机抽取5行display(df.sample(5))#查询每一列的数据类型print(df.dtypes,"\n------------")print(df["创建时间"].dtypes,"\n------------")#查询表格大小print(df.shape,"\n------------")#查询是否有空值print(df.info(),"\n------------")#获取基本统计信息display(df.describe())

d869e64105fa8db45d240fbe8798a22e.png

7068c4f1ed6c9833fa4b35e26e610d34.png

二、日期函数表

将str类型/object类型转换为datetime类型,提取年月日时分秒

属性说明
yeardatetime 的年
monthdatetime 的月
daydatetime 的日
hourdatetime 的小时
minutedatetime 的分钟
seconddatetime 的秒
microseconddatetime 的微秒
nanoseconddatetime 的纳秒
date返回 datetime.date(不包含时区信息)
time返回 datetime.time(不包含时区信息)
timetz返回带本地时区信息的 datetime.time
dayofyear一年里的第几天
weekofyear一年里的第几周
week一年里的第几周
dayofweek一周里的第几天,Monday=0, Sunday=6
weekday一周里的第几天,Monday=0, Sunday=6
weekday_name这一天是星期几 (如,Friday)
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逻辑判断是不是日期所在年是不是闰年
# 将str类型/object类型转换为datetime类型,提取年月日时分秒#先转化为datetime类型,默认format='%Y-%m-%d %H:%M:%S'df["datetime"]=pd.to_datetime(df["创建时间"],errors="coerce")print(df["创建时间"].dtypes,"\n------------")df['date'] = df['datetime'].dt.date   #转化提取年-月-日df['year'] =df['datetime'].dt.year.fillna(0).astype("int")   #转化提取年 ,#如果有NaN元素则默认转化float64型,要转换数据类型则需要先填充空值,在做数据类型转换df['month'] = df['datetime'].dt.month.fillna(0).astype("int")  #转化提取月df['%Y_%m'] = df['year'].map(str) + '-' + df['month'].map(str) #转化获取年-月df['day'] = df['datetime'].dt.day.fillna(0).astype("int")      #转化提取天df['hour'] = df['datetime'].dt.hour.fillna(0).astype("int")    #转化提取小时df['minute'] = df['datetime'].dt.minute.fillna(0).astype("int") #转化提取分钟df['second'] = df['datetime'].dt.second.fillna(0).astype("int") #转化提取秒df['dayofyear'] = df['datetime'].dt.dayofyear.fillna(0).astype("int") #一年中的第n天df['weekofyear'] = df['datetime'].dt.weekofyear.fillna(0).astype("int") #一年中的第n周df['weekday'] = df['datetime'].dt.weekday.fillna(0).astype("int") #周几,一周里的第几天,Monday=0, Sunday=6df['quarter'] = df['datetime'].dt.quarter.fillna(0).astype("int")  #季度display(df.head())

134efff4809a77432a63d5e88067fc41.png

三、统一格式按照长度截取

# 利用字符串截取原理,提取年月日时分秒#为了统一日期格式,先转化为datetime,并处理NaN元素#先转化为datetime类型,默认format='%Y-%m-%d %H:%M:%S'df['datetime'] = pd.to_datetime(df['创建时间'],errors='coerce').fillna("0000-00-00 00:00:00")#转化为字符串类型,利用截取字符串获取年月日时分秒df['date'] = df['datetime'].astype("str").str[0:10] #截取年-月-日df['%Y-%m'] = df['datetime'].astype("str").str[0:7] #截取年-月df['day'] = df['datetime'].astype("str").str[8:10] #截取日df['hour'] = df['datetime'].astype("str").str[11:13] #截取日display(df.head()) # 也是同样的结果

在做数据处理的过程,包括数据过滤、数据汇总计算等都会经常用到pandas从日期属性中提取年月日。pandasb8046860f6f7d4c5683fb9a23a31737a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将导出的 Excel 中的合同开始日期字段只显示年月日,可以使用 pandas 的 to_datetime 方法中的 strftime 函数将日期格式化为字符串再导出到 Excel 中。修改代码如下: ``` import numpy as np from datetime import datetime, timedelta import pandas as pd test = pd.read_excel("C:\\Users\\1data\\Desktop\\DBM成本收入核算\\test.xlsx") start_date = pd.to_datetime(test['合同开始日期']) end_date = pd.to_datetime(test['合同截止日期']) test['合同周期月数'] = round((end_date - start_date) / np.timedelta64(1, 'M')) start_date_col = '合同开始日期' end_date_col = '合同截止日期' new_col = '日期' for index, row in test.iterrows(): start_date = pd.to_datetime(row[start_date_col]) end_date = pd.to_datetime(row[end_date_col]) date_list = [] if start_date.day <= 15: while start_date <= end_date: date_list.append(start_date) start_date = start_date + timedelta(days=30) else: start_date = start_date + timedelta(days=30) while start_date <= end_date + timedelta(days=30): date_list.append(start_date) start_date = start_date + timedelta(days=30) # 格式化日期字符串为年月日 date_str_list = [date.strftime('%Y-%m-%d') for date in date_list] test.loc[index, new_col] = ','.join(date_str_list) # 将日期字段拆分为多列 df_tmp = test['日期'].str.split(',', expand=True) df_tmp = df_tmp.stack() df_tmp = df_tmp.reset_index(level=1, drop=True) df_tmp.name = '日期' # 将拆分后的日期列与原始 DataFrame 合并 df_new = pd.concat([test.drop(['日期'], axis=1), df_tmp], axis=1) df_new = df_new.reset_index().drop(columns='index') # 计算合同周期年月 df_new['合同周期年月'] = df_new['合同周期月数'].apply(lambda x: f"{int(x//12)}年{int(x%12)}月") # 导出到 Excel df_new.to_excel('income_test.xlsx', index=False) ``` 这样导出的 Excel 文件中的合同开始日期字段只显示年月日,而新增日期字段的取年月的字段合同周期年月也被计算出来了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值