TFHE:环面上全同态加密方案学习笔记1

Wesley13
• 阅读 1814

TFHE:环面上全同态加密方案学习笔记1

  • 全同态加密

  • 全同态算法应用之一:外包计算。

  • TFHE与全同态

  • 全同态加密中的噪声

  • TFHE

  • Torus 环面

  • TLWE密文的对称加密

  • TFHE的三种密文形式

  • TFHE的外积加速

  • 层次TFHE(TFHE IN LEVELED MODE)

  • 全同态TFHE(TFHE IN FHE MODE)

全同态加密

首先简要介绍一下什么是全同态加密:同态加密是上世纪80年代提出来的一种密码学技术:对经过同态加密的数据进行处理得到一个输出,将这一输出进行解密,其结果与用同一方法处理未加密的原始数据得到的输出结果是一样的。
传统加密大致有密钥生成、加密、解密三个关键步骤:
TFHE:环面上全同态加密方案学习笔记1

同态加密相比传统加密最核心的部分在于它的 评估操作(Evaluation) 使得对加密的密文进的运算相当于对对应的明文进行了运算。
TFHE:环面上全同态加密方案学习笔记1

如果这个函数 f 是加法,则称这个同态加密是加同态,如果这个函数 f 是乘法,则称这个同态加密是乘同态。加同态和乘同态都是半同态。如果一个算法能够同时满足加法同态和乘法同态,那么我们称之为全同态算法。2009年Gentry首次提出了基于理想格的全同态加密算法,称之为[Gentry09]或[Ge09]。

全同态算法应用之一:外包计算。

全同态加密允许在不知道数据(加密)的情况下对数据进行计算,这使得用户可以将自己需要计算的数据同态加密后加密发送给云,云能够在同态加密的数据上进行计算,随后将结果(密文)返回给用户,用户解密得到计算结果。
TFHE:环面上全同态加密方案学习笔记1

TFHE与全同态

全同态算法在2013年左右大致分为两个大类,一类为 BGV方案,另一类为 GSW方案,而TFHE属于类GSW分支,并且是FHEW方案的一个改进,TFHE方案是目前最快的全同态加密方案。
TFHE:环面上全同态加密方案学习笔记1

全同态加密中的噪声

众所周知,全同态加密是有噪声(error)的。假设有一布尔电路如下图:
TFHE:环面上全同态加密方案学习笔记1
在明文状态下评估该布尔电路,没有任何问题:TFHE:环面上全同态加密方案学习笔记1
然而,在若要在全同态加密的密文状态下评估该布尔电路(这里给你一个神奇的透视镜,让你能够看到加密密文里面加密的明文,越清晰说明噪声越小,越模糊说明噪声越大),不但评估时间变得十分漫长,噪声也随着经过的门电路的数量增加而增长,如果经过过多的门电路,则很可能导致最终的解密错误(解密后无法分辨0和1)。
TFHE:环面上全同态加密方案学习笔记1
想要解决同态加密中的噪声问题,目前有如下两种途径:

  1. LHE 层级全同态
    通过设置LHE中的安全参数,使之足够大从而支持一定深度(depth)的布尔电路的评估。
    想象上图中最左端的密文全都有3个level,密文每通过一个 与/或门 就会消耗一个level(取非操作相比于 与/或门 产生可忽略的噪声),如果最终的level小于0则密文不能够正确解密,如下图所示:
    TFHE:环面上全同态加密方案学习笔记1

  2. Bootstrapping 自举
    2009年Gentry提出了自举的最naïve的设想。整个自举过程如下:
    TFHE:环面上全同态加密方案学习笔记1
    1.现有一明文m。
    2.使用 p k 1 pk_1 pk1​对该明文进行加密,得到一个密文,此时密文新鲜(fresh),噪声较小。假设如果噪声不超过框中的红线,就可以正确地进行解密。
    3.经过一系列的评估操作之后,噪声不断增大,现在噪声已经达到红线,必须将噪声减小才能继续进行计算。最直观地方法就是对其进行解密,因为解密之后噪声会消失,但是解密需要密钥,如果这个过程在云服务器上执行的话客户端是不可能给出自己的私钥的。
    4.于是Gentry想了一个办法,他将解密函数Dec作为评估函数中的f,再用一个新的公钥 p k 2 pk_2 pk2​将整个密文加密,用户的私钥 s k 1 sk_1 sk1​(对应公钥 p k 1 pk_1 pk1​)也使用 p k 2 pk_2 pk2​进行加密后给云服务器。
    5.这时候云服务器就可以在 p k 2 pk_2 pk2​加密下进行同态解密,从而得到 p k 2 pk_2 pk2​加密的f(m),此时噪声比之前少了许多,能够支持至少一次的乘法运算。
    通过这样的自举步骤,同态加密的运算便能够不断地持续地进行。

LHE 和 Bootstrapping 两种方案各有优缺点:

层次全同态(LHE)

层次全同态(LHE)

自举(Bootstrapping)

自举(Bootstrapping)

优点

缺点

优点

缺点

在深度(depth)小的电路上很快

在很深的电路中不现实

深度没有限制

非常非常非常慢

不能实现不事先知道电路深度的电路

密钥很大

TFHE在 LHE 方案和 Bootstrapping 方案中都实现了一定的改进,接下来详细介绍TFHE。

TFHE

Torus 环面

TFHE全称为:Fully Homomorphic Encryption over the Torus。FHE代表全同态加密,而T代表环面(Torus)。因此,想了解TFHE,在了解什么是FHE后,还要了解什么是环面。
环面大概长下面这张图的样子,像一个甜甜圈(by Ilaria Chillotti):
TFHE:环面上全同态加密方案学习笔记1
实数环面 The real torus T = R / Z = R m o d 1 {\color{blue}\mathbb T}=\mathbb R / {\color{red}\mathbb Z} = \mathbb R \quad mod\quad1 T=R/Z=Rmod1
我们把一个实数环面记为( T , + , ⋅ ) {\color{blue}\mathbb T},{\color{blue}+},\sdot) T,+,⋅)的形式 ( ⋅ : Z × T → T (\sdot:{\color{red}\mathbb Z}\times {\color{blue}\mathbb T}\rightarrow{\color{blue}\mathbb T} (⋅:Z×T→T a valid external product)。括号中的 T {\color{blue}\mathbb T} T表示数据是环面里面的结构, + {\color{blue}+} +和 ⋅ \sdot ⋅两种运算(或者说两种映射)。其中 + {\color{blue}+} +(加法)类似我们平时用的加法, ⋅ \sdot ⋅(数乘)是一个从 Z {\color{red}\mathbb Z} Z和 T {\color{blue}\mathbb T} T到 T {\color{blue}\mathbb T} T的映射(外积),这里的 Z {\color{red}\mathbb Z} Z表示整数集。
下面我用蓝色表示环面 T {\color{blue}\mathbb T} T里面的元素,用红色表示整数域 Z {\color{red}\mathbb Z} Z里面的元素。
实数环面有三条性质:

  1. 它是一个阿贝尔群(环面上的加法是有定义的)。
  2. 它拥有 Z {\color{red}\mathbb Z} Z-module 结构。
  3. 它不是一个环(环面上的元素之间的乘法没有定义)。

我们可以把实数的环面扩展到n维向量或矩阵空间:( T n , + , ⋅ {\color{blue}\mathbb T^n},{\color{blue}+},\sdot Tn,+,⋅),它同样拥有 Z-module 结构。
TFHE:环面上全同态加密方案学习笔记1
我们还可以定义多项式环面:( T N [ X ] , + , ⋅ {\color{blue}\mathbb T_N[X]},{\color{blue}+},\sdot TN​[X],+,⋅),它有 R {\color{red}\mathfrak R} R-module 的结构(其中 R = Z [ X ] / ( X N + 1 ) , T N [ X ] = T [ X ] m o d ( X N + 1 ) {\color{red}\mathfrak R}=\mathbb Z [X]/(X^N+1),{\color{blue}\mathbb T_N[X]}={\color{blue}\mathbb T[X]}\quad mod \quad (X^N+1) R=Z[X]/(XN+1),TN​[X]=T[X]mod(XN+1))。下面用红色表示 R {\color{red}\mathfrak R} R中元素:
TFHE:环面上全同态加密方案学习笔记1

TLWE密文的对称加密

加密步骤:

  1. 假设消息空间 M = { 0 , 1 / 3 , 2 / 3 } M=\{0,1/3,2/3\} M={0,1/3,2/3} 是实数环面上逆时针三元消息空间。

  2. 假设现在要加密明文消息 μ = 1 / 3 m o d 1 ∈ M \mu=1/3\quad mod \quad 1 \in M μ=1/3mod1∈M。

  3. 现在给消息添加一个高斯噪声:计算phase: φ = μ + G a u s s i a n e r r o r \varphi = \mu + Gaussian error φ=μ+Gaussianerror。

  4. 然后在环面上随机选择一个 a a a作为mask(当 a = 0 a=0 a=0时为平凡(trivial)的情况,此时明文与密钥相互独立,没有加密的效果)。
    TFHE:环面上全同态加密方案学习笔记1

  5. 随后可以使用密钥s进行加密,得到密文: b = s ⋅ a + φ b=s\sdot a+\varphi b=s⋅a+φ(LWE形式,安全性基于LWE问题的困难性)。加密后的密文 b b b看起来像一个随机数。

  6. 同样也可以使用密钥s进行解密,得到phase: φ = b − s ⋅ a \varphi=b-s\sdot a φ=b−s⋅a,再对phase进行取整(round)到最近的消息空间中的元素(也可以求期望),最终可得到消息 μ \mu μ。
    TFHE:环面上全同态加密方案学习笔记1

这虽然是LWE困难问题,却没有LWE中的 mod q q q 操作(实数环中 mod 1)。
TLWE密文具有同态性质,在密文上进行线性组合,其对应明文也会做相应的线性组合,噪声也随之增加。换句话说,我们对TLWE上的元素做一个线性组合,那它们的 a a a和 b b b也会有相应的线性关系,如果我们把它解密, φ \varphi φ也会有同样的关系。因为我们添加的噪声是高斯噪声,我们对 φ \varphi φ求平均得到消息 μ \mu μ,也会满足这个关系。这是环面上自带的加同态的性质,对于全同态加密的设计来说是一个很好的性质。
TFHE:环面上全同态加密方案学习笔记1

TFHE的三种密文形式

除TLWE密文外,TFHE方案中还有两种密文:TRLWE密文与TGSW密文。将TLWE拓展到多项式环面,可得TRLWE密文,将GSW方案拓展至环面,可得TGSW密文。接下来给出TFHE三种密文格式的定义:

  • TLWE 密文: c = ( a , b ) ∈ T n + 1 c=(a,b)\in \mathbb T^{n+1} c=(a,b)∈Tn+1
    其中 b = s ⋅ a + φ , φ = e + μ b=s\sdot a+\varphi,\varphi=e+\mu b=s⋅a+φ,φ=e+μ

  • TRLWE 密文: c = ( a , b ) ∈ T N [ X ] 2 c=(a,b)\in \mathbb T_N[X]^2 c=(a,b)∈TN​[X]2
    其中 b = s ⋅ a + e + μ , e ∈ T N [ X ] G a u s s i a n b=s\sdot a+e+\mu,e \in \mathbb T_N[X]Gaussian b=s⋅a+e+μ,e∈TN​[X]Gaussian

  • TRGSW 密文: C = Z + m ⋅ G 2 ∈ T n [ X ] 2 l × 2 C=Z+m\sdot G_2\in \mathbb T_n[X]^{2 l \times 2} C=Z+m⋅G2​∈Tn​[X]2l×2
    其中 Z Z Z 为长 2 l 2l 2l 的一列0的RLWE加密, G 2 G_2 G2​为 gadget 矩阵。

给一个直观的感受:
TFHE:环面上全同态加密方案学习笔记1
下面给出三种密文的明文、密文和密钥的形式,以及可以进行的运算:

名称

明文

密文

线性组合

product

密钥

TLWE

T \mathbb T T

T n + 1 \mathbb T^{n+1} Tn+1

√ \surd √

× \times ×

B n \mathbb B^n Bn

TRLWE

T N [ X ] \mathbb T_N[X] TN​[X]

T N [ X ] 2 \mathbb T_N[X]^2 TN​[X]2

√ \surd √

× \times ×

B N [ X ] \mathbb B_N[X] BN​[X]

TRGSW

Z [ X ] / ( X n + 1 ) \mathbb Z[X]/(X^n+1) Z[X]/(Xn+1)

T N [ X ] 2 l × 2 \mathbb T_N[X]^{2l\times 2} TN​[X]2l×2

√ \surd √

√ \surd √

B N [ X ] \mathbb B_N[X] BN​[X]

TFHE的外积加速

我们发现TLWE密文和TRLWE密文只能进行线性组合,不能进行Product(积)的操作,即只能做加法不能做乘法。TFHE的研究者在定义了TLWE密文和TRLWE密文后,觉得好像离全同态加密还差一点,于是他们从GSW方案中找到了灵感。GSW方案中有一个ring product(内积)的操作:TFHE:环面上全同态加密方案学习笔记1
输入是两个TGSW samples, Z [ X ] \mathbb Z[X] Z[X]是整数多项式,输出是一个TGSW sample,解密后得到两个消息的乘积,噪声小于等于 ‖ μ A ‖ η B + O ( η A ) ‖\mu_A‖\eta_B+O(\eta_A ) ‖μA​‖ηB​+O(ηA​)。这里观察到,尽管运算是对称的,但是它产生的噪声是不对称的。TFHE的研究者基于这个特性研究出了TFHE:把其中一个输入换成TLWE类型,然后输出也变成了TLWE类型,计算变成了点乘(外积)。
TFHE:环面上全同态加密方案学习笔记1
噪声本来就不对称,现在更不对称了(更小了)。然后便可以用分解的方法,把原来TGSW的每行拆开,在并行计算,将原来的叉乘(内积)都变成了点乘(外积),得到一个很大的提速
TFHE:环面上全同态加密方案学习笔记1
下面给出内积和外积的具体表达式以及直观的感受:
TFHE:环面上全同态加密方案学习笔记1

层次TFHE(TFHE IN LEVELED MODE)

这一部分使用层次TFHE实现一个确定型自动机的评估。使用上面所说的同态外积构造门:
TFHE:环面上全同态加密方案学习笔记1
设TGSW密文的消息空间为 { 0 , 1 } ∈ Z [ X ] \{0,1\}\in \mathbb Z[X] {0,1}∈Z[X],TLWE密文的消息空间为 { 0 , 1 / 2 } ∈ T [ X ] \{0,1/2\}\in \mathbb T[X] {0,1/2}∈T[X],这样噪声中的 ∣ ∣ μ A ∣ ∣ 1 ||\mu_A||_1 ∣∣μA​∣∣1​就没有了(为1)。
接下来为TFHE选择门电路,这里给出四种图灵完备的门电路组合:

  1. Or, And, Not
    DNF logic

  2. Xor, And, 1
    Multivariate polynomials

  3. Nand
    minimal indeed

  4. Mux, 0, 1
    Because we get binary decision diagrams for free

在LHE里面通常选择Xor这一组,FHEW选择了与非门,而(level)TFHE选择的是Mux电路,因为它可以几乎没有消耗的做二进制选择(噪声呈线性增长)。
Mux门电路的选择逻辑很简单,如果c为0则输出b,如果c为1则输出a:
C M u x ( c , a , b ) = b + c ⊡ ( a − b ) CMux(c,a,b)=b+c\boxdot(a-b) CMux(c,a,b)=b+c⊡(a−b)
TFHE:环面上全同态加密方案学习笔记1
在(level)TFHE的Mux门电路中有不同的线:图中深红色的线成为控制线(Control line),传输TGSW密文,蓝色的先称为数据线(data line),传输TLWE密文。
随后,我们便可以使用Mux门电路构造和评估任意的 查找表/布尔函数(噪声随电路深度的增加线性增长):
TFHE:环面上全同态加密方案学习笔记1
进而可以评估(输入长度已知并固定的)任意确定型(有穷)自动机:
TFHE:环面上全同态加密方案学习笔记1

全同态TFHE(TFHE IN FHE MODE)

为实现任意深度电路的同态评估,需要为TFHE引入自举(bootstrapping)操作。
自Gentry于2009年提出自举以来,自举从同态解密(Gentry09),到重加密,到压缩解密函数,再到密钥交换&模交换(FHEW&TFHE使用)。在Gentry09的自举(前面有写)中,自举是一个单独的函数,仅用于减小噪声;而在TFHE中,自举可以改变消息内容。接下来介绍TFHE中的自举门(gate bootstrapping)。
我们现在有一个二进制的消息空间,消息只有false和true。设false是 − 1 / 8 ( − 1 / 8 = 7 / 8 ) -1/8(-1/8=7/8) −1/8(−1/8=7/8),噪声小于 1 / 16 1/16 1/16,设true是$1/8true( 1 / 8 ) 1/8) 1/8),噪声也小于 1 / 16 1/16 1/16。现在再给你一副神奇的眼镜,让你能够看到LWE加密下的明文。
TFHE:环面上全同态加密方案学习笔记1
然后我们把两个环面相加。它们的值可能是真或假。如果他们都是假,那会得到 3 / 4 3/4 3/4(红色),如果他们一真一假,会得0(黄色),如果他们都是真,得到 1 / 4 1/4 1/4(绿色)。:
TFHE:环面上全同态加密方案学习笔记1
在能够看到明文的条件下,如何进行自举的与非操作呢?非常简单,我们把这个环面画一条线,落在线的左边就输出true,落在右边就输出false:
TFHE:环面上全同态加密方案学习笔记1
难点在于我们如何在密文(摘掉你的神奇眼镜)下进行操作。TFHE给出了这样的答案:

  1. 首先从一个(平凡的)TLWE ( v 0 + v 1 X + … + v ( N − 1 ) X ( N − 1 ) ) a (v_0+v_1X+…+v_(N-1)X^(N-1))^a (v0​+v1​X+…+v(​N−1)X(N−1))a开始
  2. 将其旋转 p = − φ s ( a , b ) p=-\varphi_s(a,b) p=−φs​(a,b)个位置
  3. 取出常数项constant term(其加密 v p v_p vp​)

TFHE:环面上全同态加密方案学习笔记1
最困难的部分在第2步。将环面旋转 p p p个位置有两种情况:
在 p p p已知的情况下,旋转操作为 ( X p ⋅ c ) (X^p \cdot c) (Xp⋅c)。
在 p p p未知的情况下,旋转操作为 ( T G S W ( X p ) ⊡ c ) (TGSW(X^p) \boxdot c) (TGSW(Xp)⊡c)。
那么,如何在未知s(私钥)的情况下,旋转 − φ s ( a , b ) = − b + ∑ i = 1 n a i s i -\varphi_{\color{red}s}(a,b)=-b+\sum_{i=1}^{n} {a_is_i} −φs​(a,b)=−b+∑i=1n​ai​si​个位置呢?

  1. 首先反方向旋转 b b b个位置,即Multiply by X − b X^{-b} X−b, b b b为密文,事先知道可以直接计算。
  2. For i ∈ [ 1 , n ] i \in [1,n] i∈[1,n] multiply by T G S W ( X − a i s i ) TGSW(X^{-a_i{\color{red}s_i}}) TGSW(X−ai​si​)
    X a i s i = 1 + ( X a i − 1 ) ⋅ s i , s i ∈ { 0 , 1 } X^{a_i{\color{red}s_i}}=1+(X^{a_i}-1)\sdot{\color{red}s_i},{\color{red}s_i}\in\{0,1\} Xai​si​=1+(Xai​−1)⋅si​,si​∈{0,1}
    T G S W ( X a i s i ) = h + ( X a i − 1 ) ⋅ T G S W ( s i ) , B K = T G S W ( s i ) TGSW(X^{a_i{\color{red}s_i}})=h+(X^{a_i}-1)\sdot TGSW({\color{red}s_i}),BK=TGSW({\color{red}s_i}) TGSW(Xai​si​)=h+(Xai​−1)⋅TGSW(si​),BK=TGSW(si​)
    私钥 s s s事先未知,将其变为公钥 B K BK BK(Bootstrapping Key)。

完成这两部就能够完成这个旋转的任务。正确性和安全性本文不作证明。
总结自举算法:
Input:

  • Anticyclical parameters v 0 , . . . , v 2 N − 1 ∈ T v_0,...,v_{2N-1} \in \mathbb T v0​,...,v2N−1​∈T
  • A LWE sample ( a , b ) (a,b) (a,b) rescaled on Z / 2 N Z \mathbb Z / 2N \mathbb Z Z/2NZ
  • {\color{red}Some encryptions} of its secret key s ∈ { 0 , 1 } n s \in \{0,1\}^n s∈{0,1}n

Output:

  • An encryption of v φ v_\varphi vφ​ where φ = b − ∑ a i s i m o d 2 N \varphi =b-\sum_{a_is_i} \quad mod\quad 2N φ=b−∑ai​si​​mod2N

Algorithm:

  1. Setup( v v v)

  2. PlainRotate by X − b X^{-b} X−b positions

  3. for i = 1 to n
    EncRotate by T G S W ( X a i s i ) {\color{red}TGSW(X^{a_is_i})} TGSW(Xai​si​) positions

  4. Extract

主要参考论文:

  • Chillotti I, Gama N, Georgieva M, et al. Faster fully homomorphic encryption: Bootstrapping in less than 0.1 seconds[C]//international conference on the theory and application of cryptology and information security. Springer, Berlin, Heidelberg, 2016: 3-33.
  • Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE[C]//International Conference on the Theory and Application of Cryptology and Information Security. Springer, Cham, 2017: 377-408.

本文仅供个人学习使用

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
DES与RSA加解密
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。大体上分为双向加密 和单向加密 ,而双向加密又分为对称加密 和非对称加密(有些资料将加密直接分为对称加密和非对称加密)。 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。而
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这