[Python] las marcas de tiempo de salida de datetime y pd.to_datetime son diferentes

¿Por qué los valores de las marcas de tiempo de salida son diferentes, uno es 1447344000 y el otro es 1447372800, cómo hacer que emitan el mismo valor?

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
stmp2 = pd.to_datetime(tm)
print(stmp1.timestamp())
print(stmp2.timestamp())
## output
## 1447344000
## 1447372800

resuelto

1. Motivo


El módulo de fecha y hora en Python tiene como valor predeterminado la zona horaria local cuando la cadena de tiempo no contiene información de zona horaria , ya que crea y maneja objetos de fecha y hora en función de la configuración de hora del sistema . Las series temporales en Pandas utilizan la zona horaria UTC de forma predeterminada porque es un estándar internacional para evitar el horario de verano y otros problemas regionales . Si desea convertir zonas horarias en Pandas, puede usar los métodos tz_localize y tz_convert.

2. Convierta la marca de tiempo de nuevo en fecha y hora

Cálculo en línea y marca de tiempo de conversión :
puede ver que datetime usa la zona horaria local de forma predeterminada, 1447344000que corresponde a la hora de Beijing 2015-11-13 00:00:00; pd.to_datetime usa la zona horaria UTC de forma predeterminada, 1447372800que corresponde a la hora UTC2015-11-13 00:00:00
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

3 solución alternativa, especifique la zona horaria

3.1 Uso de cadenas de tiempo con zonas horarias

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00+08:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S%z")
stmp2 = pd.to_datetime(tm)
print(stmp1.timestamp())  # 输出:1447344000.0
print(stmp2.timestamp())     # 输出:1447344000.0

3.2 Especificar o modificar la zona horaria de datetime

3.2.1 Análisis de marcas de tiempo de fecha y hora

from datetime import datetime
from pytz import timezone
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
print(stmp1.timestamp())  # 输出:1447344000.0
# 指定时区,修改datetime的tzinfo属性
# 指定UTC时区
utc_dt = stmp1.replace(tzinfo=timezone("UTC"))
print(utc_dt.timestamp())  # 输出:1447372800.0
# 指定北京时区
bj_dt = stmp1.replace(tzinfo=timezone("Asia/Shanghai"))
print(bj_dt.timestamp())  # 输出:1447343640.0
# 转换时区为UTC时区
utc_dt_c = stmp1.astimezone(timezone("UTC"))
print(utc_dt_c.timestamp())  # 输出:1447344000.0
# 转换时区为北京时区
bj_dt_c = stmp1.astimezone(timezone("Asia/Shanghai"))
print(bj_dt_c.timestamp())  # 输出:1447344000.0

Se puede ver que la diferencia entre replace(tzinfo=timezone(“UTC”)) y .astimezone(timezone) es:
replace(tzinfo=timezone(“UTC”)) solo modifica el atributo tzinfo del objeto de fecha y hora, y no modifica los valores de fecha y hora. Si lo hace, puede generar marcas de tiempo o conversiones de zona horaria incorrectas.
astimezone(timezone) ajustará los valores de fecha y hora de acuerdo con las reglas de la zona horaria, para que la marca de tiempo permanezca sin cambios. Hacer esto convierte correctamente la zona horaria.
Por lo tanto, se recomienda utilizar astimezone(timezone) para especificar o convertir la zona horaria.

3.2.2 Atención

Si el tzinfo del stmp1 original es ("Asia/Shanghai"), ¿por qué bj_dt = stmp1.replace(tzinfo=timezone("Asia/Shanghai")), las marcas de tiempo de bj_dt y stmp1 son inconsistentes

Esto se debe a que el método replace() no convierte la zona horaria, solo modifica el atributo tzinfo. Si el tzinfo del stmp1 original es ("Asia/Shanghai"), entonces su marca de tiempo se calcula de acuerdo con la hora de Beijing. Si usa el método replace () para crear un nuevo objeto de fecha y hora bj_dt, especificando también la zona horaria ("Asia/Shanghai"), su marca de tiempo se calcula en función de la hora UTC y luego agrega el desplazamiento de la zona horaria. Por lo tanto, las marcas de tiempo de los dos objetos son incoherentes.
Si desea que las marcas de tiempo de dos objetos sean iguales, puede usar el método astimezone() para convertir la zona horaria o usar el método replace() para eliminar la zona horaria.

3.2.3 Modificar la marca de tiempo de fecha y hora

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
stmp2 = pd.to_datetime(tm)

stmp1_pd = pd.Timestamp(stmp1, tz='UTC')
print(stmp1_pd.timestamp())  # 输出:1447372800.0
print(stmp2.timestamp())     # 输出:1447372800.0

3.3 Especifique la zona horaria de los pandas como hora de Asia/Shanghai

Utilice el método pd.Series.dt.tz_localize para localizar los datos de fecha y hora en la zona horaria de destino. Utilice el método pd.Series.dt.tz_convert para convertir datos de fecha y hora de una zona horaria a otra.

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
# 生成当前时间的时间戳,不指定时区
stmp2  = pd.Timestamp(tm, tz='Asia/Shanghai')
print(stmp1.timestamp())  # 输出:1447344000.0
print(stmp2.timestamp())     # 输出:1447344000.0

o

from datetime import datetime
import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
# 生成当前时间的时间戳,不指定时区
stmp2  = pd.to_datetime(tm).tz_localize('Asia/Shanghai')
print(stmp1.timestamp())  # 输出:1447344000.0
print(stmp2.timestamp())     # 输出:1447344000.0

3.4 Convierta la marca de tiempo de toda la columna a la hora de Beijing

    df['tmt']= pd.to_datetime(df['stamp'], unit='s', origin=pd.Timestamp('1970-01-01')).dt.tz_localize('Asia/Shanghai')
    df['tm'] = df['tmt'].dt.strftime('%Y-%m-%d %H:%M:%S')

Conversión de formato de hora: puede usar la función pd.to_datetime() para convertir una cadena o un número a un formato de hora, como pd.to_datetime('2022-01-01'). Si necesita especificar el formato de hora, puede usar el parámetro de formato, como pd.to_datetime('2022-01-01', format='%Y-%m-%d').

Conversión de zona horaria: las columnas de hora se pueden localizar en una zona horaria determinada mediante la función tz_localize(), por ejemplo, df['time'].dt.tz_localize('UTC'). Luego use la función tz_convert() para convertirlo a otra zona horaria, por ejemplo, df['time'].dt.tz_convert('Asia/Shanghai').

Cálculo de la diferencia horaria: Puede utilizar la función pd.Timedelta() para calcular la diferencia entre dos horas, por ejemplo, pd.Timedelta(days=1) significa la diferencia horaria de un día. También puede usar la función pd.DateOffset() para cálculos de compensación de tiempo más flexibles. Por ejemplo, pd.DateOffset(months=3) indica el tiempo después de tres meses.

Operación de series de tiempo: pandas proporciona una gran cantidad de funciones de operación de series de tiempo, como la función resample() para volver a muestrear la serie de tiempo y la función rolling() para realizar cálculos de ventana móvil. Cabe señalar que estas funciones utilizan la hora en la zona horaria local de forma predeterminada.Si necesita operar entre diferentes zonas horarias, primero debe realizar la conversión de zona horaria.

apéndice

Todos los tipos de espíritus de lucha de IA son básicamente inútiles para resolver el problema. Lo siguiente es solo para registros, y el valor de referencia es limitado ~

Wenxinyiyan

En Python, tanto datetime.datetime.strptime() como pd.to_datetime() son funciones para convertir una cadena en un objeto de fecha y hora, pero funcionan de formas ligeramente diferentes.

La función datetime.datetime.strptime() analiza una cadena en un objeto datetime.datetime y lo convierte a un formato de fecha y hora de acuerdo con la cadena de formato especificada. En su código, tm es una cadena que representa una fecha y hora en el formato "%Y-%m-%d %H:%M:%S". stmp1 se crea analizando tm en un objeto de fecha y hora.

La función pd.to_datetime() es una función en la biblioteca pandas para convertir diferentes tipos de entradas de fecha y hora en objetos pandas.Timestamp. En su código, tm es una cadena que representa una fecha y hora, y stmp2 se crea al convertir tm en un objeto pandas.Timestamp.

Al convertir un objeto de fecha y hora en una marca de tiempo, la salida de los dos métodos puede diferir. stmp1.timestamp() devolverá un flotante basado en la marca de tiempo de Unix que representa la cantidad de segundos desde el 1 de enero de 1970. Y stmp2.timestamp() devolverá un número entero basado en la marca de tiempo interna de la biblioteca de pandas, que representa la marca de tiempo de la versión de la biblioteca de pandas.

Por lo tanto, la salida puede variar según la biblioteca utilizada y cómo se representan los objetos de fecha y hora. Tenga en cuenta que cuando utilice ambos métodos, debe asegurarse de utilizar la misma representación de marca de tiempo para las comparaciones y los cálculos.

Para hacer que las marcas de tiempo generadas por datetime.datetime.strptime() y pd.to_datetime() sean coherentes, puede usar la función pd.to_datetime() para convertir el objeto datetime.datetime en un objeto pandas.Timestamp y especificar el parámetro unit='unix', que convertirá la marca de tiempo en una marca de tiempo Unix.

Aquí hay un código de muestra:

import datetime  
import pandas as pd  
  
tm = '2015-11-13 00:00:00'  
stmp1 = datetime.datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")  
stmp2 = pd.to_datetime(stmp1, unit='unix')  
  
print(stmp1.timestamp())  
print(stmp2.timestamp())

La salida será consistente, tanto con las marcas de tiempo de Unix:

1447438800.0
1447438800
Tenga en cuenta que en este código, primero usamos datetime.datetime.strptime() para convertir la cadena en un objeto datetime.datetime, luego usamos pd.to_datetime() para convertir el objeto datetime.datetime en un objeto pandas.Timestamp y lo pasamos como argumento a unit='unix'. Esto convierte las marcas de tiempo en marcas de tiempo de Unix, lo que permite una salida consistente.

Nota del autor : se informó un error
inserte la descripción de la imagen aquí

Chispa - chispear

Esto se debe a que el parámetro utc=True de la función pd.to_datetime() convertirá la cadena de tiempo a la hora UTC, pero la función strptime() no lo hará. Si desea obtener la misma marca de tiempo, puede usar el siguiente código:

import pandas as pd
from datetime import datetime

tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
stmp2 = pd.to_datetime(tm, format="%Y-%m-%d %H:%M:%S").replace(tzinfo=None)
print(stmp1.timestamp())
print(stmp2.timestamp())

Nota del autor : mi salida aquí todavía es inconsistente

## output
## 1447344000.0
## 1447372800.0

bing

Este problema puede deberse a diferentes configuraciones de zona horaria. La función pandas.to_datetime() no fuerza la entrada a UTC de forma predeterminada, las entradas ambiguas de zona horaria seguirán siendo ambiguas, mientras que las entradas no ambiguas de zona horaria conservarán su compensación de tiempo de 1. Podría intentar configurar el parámetro utc=True al llamar a pd.to_datetime() para devolver siempre una marca de tiempo localizada en UTC con la zona horaria.

Puedes probar el siguiente código:

import pandas as pd
tm = '2015-11-13 00:00:00'
stmp1 = pd.to_datetime(tm, utc=True)
stmp2 = pd.to_datetime(tm, utc=True)
print(stmp1.timestamp())
print(stmp2.timestamp())

Si desea que la biblioteca datetime genere los mismos resultados que la biblioteca pandas, puede intentar especificar la información de la zona horaria al llamar a datetime.datetime.strptime(). Por ejemplo, puede utilizar el siguiente código:

from datetime import datetime, timezone
import pandas as pd

tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S").replace(tzinfo=timezone.utc)
stmp2 = pd.to_datetime(tm, utc=True)

print(stmp1.timestamp())
print(stmp2.timestamp())

Nota del autor : lo reemplacé directamente

## output
## 1447344000.0
## 1447372800.0

Tongyiqianwen

Debido a que el método datetime.datetime.strptime acepta una cadena como parámetro, y el método pandas.to_datetime puede convertir una cadena en cualquier formato de hora en un objeto de fecha y hora, por lo que si dos cadenas de marcas de tiempo tienen formatos diferentes, después de que se conviertan en objetos de fecha y hora, sus valores de marca de tiempo no serán los mismos.
Para hacer que dos objetos de fecha y hora generen el mismo valor de marca de tiempo, deben convertirse al mismo formato, por ejemplo, use el método datetime.datetime.strptime para convertir ambas cadenas a un formato admitido por el método datetime.strptime. Luego, conviértalos en valores de marca de tiempo usando el método datetime.timestamp.
Aquí hay un código de muestra que muestra cómo convertir dos objetos de fecha y hora al mismo formato y hacer que generen el mismo valor de marca de tiempo:

from datetime import datetime, timedelta

### 创建两个datetime对象
tm = '2015-11-13 00:00:00'
stmp1 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")
stmp2 = datetime.strptime(tm, "%Y-%m-%d %H:%M:%S %H:%M:%S")

###  将它们转换为相同的格式
stmp1 = stmp1.replace(microsecond=0)
stmp2 = stmp2.replace(microsecond=0)

###  将它们转换为timestamp值
timestamp1 = stmp1.timestamp()
timestamp2 = stmp2.timestamp()

### 输出结果
print("strptime结果:", timestamp1)
print("strptime结果:", timestamp2)
输出结果为:

strptime结果: 2016-11-11 16:23:11
strptime结果: 2016-11-11 16:23:11

Se puede ver que los valores de marca de tiempo de los dos objetos de fecha y hora son los mismos después de la conversión. Tenga en cuenta que al usar el método datetime.strptime para convertir una cadena de fecha y hora en un objeto de fecha y hora, si se especifica un formato de fecha y hora, se debe usar el mismo formato para la conversión; de lo contrario, el valor de la marca de tiempo puede ser diferente.

ChatGLM

Esto se debe a que las funciones datetime.datetime.strptime() y pd.to_datetime() tienen diferentes métodos de análisis para cadenas de tiempo.
La función datetime.datetime.strptime() es una función de fecha y hora en la biblioteca estándar de Python que analiza una cadena de tiempo en un objeto de fecha y hora integrado en Python. Entre los parámetros de esta función, la cadena de formato de hora debe pasarse en el formato %Y-%m-%d %H:%M:%S.
La función pd.to_datetime() es una función de fecha y hora en la biblioteca de Pandas, que analiza una cadena de tiempo en un objeto de marca de tiempo de Pandas. Entre los parámetros de esta función, la cadena de formato de hora debe pasarse en el formato %Y-%m-%d %H:%M:%S, y la cadena de hora debe convertirse al tipo datetime64 utilizando primero la función pandas.to_datetime().
Por lo tanto, si desea que estas dos funciones generen el mismo valor de marca de tiempo, debe pasar la cadena de tiempo en el mismo formato y usar la función pandas.to_datetime() para convertir la cadena de tiempo al tipo datetime64. Como sigue:

tm = '2015-11-13 00:00:00'  
stmp1 = datetime.datetime.strptime(tm, "%Y-%m-%d %H:%M:%S")  
stmp2 = pandas.to_datetime(tm)
print(stmp1.timestamp())  
print(stmp2.timestamp())  
输出结果:
1447344000.0  
1447344000.0  

Supongo que te gusta

Origin blog.csdn.net/qq_25262697/article/details/131465120
Recomendado
Clasificación