Pandas_实现数字顺序填充、指定值交替填充、日期顺序填充(按日、月、年)

excel表的数据情况如下:下面数据区域的左边和上边都是空,这会导致我们读取近pathon里时,结构不是我们要的,需要用到skiprow和usecols来控制我们想要读取的区域

整合:

import pandas as pd
from datetime import date,timedelta

books = pd.read_excel("../004/Books.xlsx",skiprows=3,usecols="C:F",dtype={"ID":str,"InStore":str,"Date":str})
# books.dtypes

# 设置个起始日期
start = date(2019,1,1)

# 设置个月份递增的函数
def add_month(d,md):
    y = md // 12
    m = d.month + md % 12
    if m !=12:
        y += m // 12
        m = m % 12
    return date(d.year + y, m,d.day)

for i in books.index:
    books["ID"].at[i]=i+1
    books["InStore"].at[i]="YES" if i % 2 ==0 else "ON"
#     books["Date"].at[i]=start + timedelta(days=i)    # 逐日增加
#     books["Date"].at[i]=add_month(start,i)           # 逐月增加
    books["Date"].at[i]=date(start.year+i,start.month,start.day)    # 逐年增加

print(books)

# 设置索引为ID列
books.set_index("ID",inplace=True)
# 将设置好的数据存入名为:out_books的excel表里
books.to_excel("out_books.xlsx")
print("Done!")

结果图:

 分解:

import pandas as pd

# skiprows=3 表示跳过上面的3行后再读取
# usecols="C:F" 表示读取excel里C到F的列,如果时要跳着选择列可以写成:usecols="C,D,E,F"

books = pd.read_excel("../004/Books.xlsx",skiprows=3,usecols="C:F",dtype={"ID":str,"InStore":str,"Date":str})

print(books.head())

一、为ID列自动填充1-20的数字 :

# ID列的数据都是NaN,NaN的类型是浮点数,如果不先转换ID列的数据类型,直接给ID填充赋值后的数据也是浮点类型,因此我们需要在导入数据时就把
# 字段的类型先做转换,但是因为NaN的数据不让我们转为int,会报错,我们可以用个小技巧,把NaN的列先转换为str类型,这样一会就可以正常赋值

print("=====>",books["ID"].dtypes)  # 这句是为了查看ID的数据类型

# 下面开始给指定列赋值
# 方法1:
for i in books.index:
    books["ID"].at[i]=i+1

# 方法2:
for i in range(0,20):
#     books["ID"].at[i]=i+1   这是先找出指定的那一列(Series),再找到要替换的那一行
    books.at[i,"ID"]=i+1     # 这是直接在二维表(DataFrame)里指定第几行,第几列要替换

print(books)

print("======>",books.dtypes)  # 这句是查看books数据里所有列的数据类型

结果图:

 二、给 InStore 列 替换式的填充 YES 和 NO :

for i in books.index:
    books["InStore"].at[i]="YES" if i % 2 ==0 else "NO"
print(books.head())

结果图:

三、 按日期填充数据:

# 先导入datetime库
from datetime import date,timedelta

# 先设置一个起始日期
start = date(2019,1,1)

 1、给 Date 列的日期逐日增加填充 

# 按日给Date列填充时间
for i in books.index:
    books["Date"].at[i]=start+timedelta(days=i)   # 用 timedelta(days=i) 实现按日填充
#     books["Date"].at[i]=date(start.year,start.month,start.day+i)    也可以这么写来实现逐日填充
print(books)

结果图:

 2、给 Date 列的日期按年填充  :

for i in books.index:
    books["Date"].at[i]=date(start.year+i,start.month,start.day)

print(books.head())

结果图:

 3、给 Date 列的日期按月份填充,需要设置个函数实现:

# d:传入的起始日期
# md: 要增加多少个月

def add_month(d,md):
    y = md //12   # 要增加的月份能换算成多少年
    m = d.month + md % 12   # md % 12:要增加的月份除以12后的余数(即剩下多少个月)
    if m !=12:
        y += m // 12
        m = m % 12
    return date(d.year+y,m,d.day)
    
# 用for 循环填充
for i in books.index:
    books["Date"].at[i]=add_month(start,i)

print(books)

结果图:

原文地址:https://www.cnblogs.com/wodexk/p/10802868.html

时间: 2024-08-03 02:44:47

Pandas_实现数字顺序填充、指定值交替填充、日期顺序填充(按日、月、年)的相关文章

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输

算法--链表指定值清除

转载请标明出处http://www.cnblogs.com/haozhengfei/p/5155a3f1ce0612e35ec202156921836f.html 链表指定值清除 第8节 链表指定值清除练习题 现在有一个单链表.链表中每个节点保存一个整数,再给定一个值val,把所有等于val的节点删掉. 给定一个单链表的头结点head,同时给定一个值val,请返回清除后的链表的头结点,保证链表中有不等于该值的其它值.请保证其他元素的相对顺序. 测试样例: {1,2,3,4,3,2,1},2 {1

【剑指offer】调整数组顺序

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25829395 剑指offer上的第14题,九度OJ为了确保输出的结果的唯一性,在输出上做了修改,因此采用的方法自然与书本上不同,这里没有限制,思来想去还是用最简单的方法来做了,非常简单的方法,直接上代码. 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.

【Java】 剑指offer(58-1) 翻转单词顺序

  本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出"student. a am I". 思路 一开始自己觉得要用split()方法,但这要开辟新的数组,占内存空间,不行. 首先实现翻转整个句子:只需要在首尾两端各放置一个

二分查找,查指定值、小于k的最大值,大于k的最大值

我们经常会用到二分查找 二分查找应该很多人都会写了,今天要写一个用二分查找找到小于k的最大值的时候看了很久不懂他设计的思路,后来想通了,记录一下. 所以这篇主要是讲 用二分查找找到小于k的最大值和大于k的最大值. 二分查找查找指定值 这个挺简单的,直接上代码吧 //获取值是k的位置,找不到则返回-1 public static int getK(int[] a, int k){ if(a.length == 0){ return -1; } int l = 0; int r = a.length

js删除数组元素中的指定值

js删除数组元素中的指定值:所谓删除数组元素中指定的值,就是删除具有指定的数组项,下面就通过实例代码代码介绍一下如何实现此功能.代码如下: var theArray=["蚂蚁部落",2,"青岛市南区","antzone","蚂蚁部落"]; for(var i=0;i<theArray.length;i++){ if(theArray[i]=="蚂蚁部落"){ theArray.splice(i,1);

jquery简单原则器(匹配索引为指定值的元素)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>简单选择器</title> &

jquery简单原则器(匹配索引大于指定值的元素)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>简单选择器</title> &

找出数组中两数之和为指定值的所有整数对

一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一: 先将整型数组排序,排序之后定义两个指针left和right.left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素 将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--:若前者小,left++:若相等,则找到了一对整数之和为指定值的元素