【问题标题】:Strange behavior with pandas timestamp to posix conversion熊猫时间戳到posix转换的奇怪行为
【发布时间】:2019-12-19 07:15:18
【问题描述】:

我做了以下操作:

  1. 通过apply(strptime)将pandas数据帧中的字符串日期时间转换为python日期时间
  2. 通过.timestamp()方法将datetime转换为posix时间戳
  3. 如果我使用 .fromtimestamp() 将 posix 恢复为 datetime,我将获得不同的日期时间

我的时区相差 3 小时(我现在在 UTC+3),所以我认为这是一种时区问题。我也知道在应用中它会隐式转换为pandas.Timestamp,但我不明白这种情况下的区别。

这种奇怪行为的原因是什么,我应该怎么做才能避免它?实际上,在我的项目中,我需要将这个 pandas 时间戳与正确的 poxis 时间戳进行比较,现在它工作错了。

以下是虚拟的可重现示例:

df = pd.DataFrame(['2018-03-03 14:30:00'], columns=['c'])
df['c'] = df['c'].apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'))
dt = df['c'].iloc[0]
dt
>> Timestamp('2018-03-03 14:30:00')
datetime.datetime.fromtimestamp(dt.timestamp())
>> datetime.datetime(2018, 3, 3, 17, 30)

【问题讨论】:

标签: python pandas datetime timezone


【解决方案1】:

首先,我建议在使用pandas 时使用np.timedelta64 dtype。在这种情况下,它使互惠变得简单。

pd.to_datetime('2018-03-03 14:30:00').value
#1520087400000000000

pd.to_datetime(pd.to_datetime('2018-03-03 14:30:00').value)
#Timestamp('2018-03-03 14:30:00')

其他方法的问题是 POSIX 以 UTC 作为原点,但 fromtimestamp 返回本地时间。如果您的系统不符合 UTC,那么我们就会遇到问题。以下方法可以解决这个问题:

from datetime import datetime
import pytz

dt
#Timestamp('2018-03-03 14:30:00')

# Seemingly problematic:
datetime.fromtimestamp(dt.timestamp())
#datetime.datetime(2018, 3, 3, 9, 30)

datetime.fromtimestamp(dt.timestamp(), tz=pytz.utc)
#datetime.datetime(2018, 3, 3, 14, 30, tzinfo=<UTC>)

datetime.combine(dt.date(), dt.timetz())
#datetime.datetime(2018, 3, 3, 14, 30)

mytz = pytz.timezone('US/Eastern')  # Use your own local timezone
datetime.fromtimestamp(mytz.localize(dt).timestamp())
#datetime.datetime(2018, 3, 3, 14, 30)

【讨论】:

    【解决方案2】:

    to_datetime 函数的答案:

    df = pd.DataFrame(['2018-03-03 14:30:00'], columns=['c'])
    df['c'] = pd.to_datetime(df['c'].values, dayfirst=False).tz_localize('Your/Timezone')
    

    使用日期时,您应该始终设置一个更容易使用的时区。

    它没有解释pandas中的datetime和单独的区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 2016-06-07
      • 2020-04-16
      • 2014-10-28
      • 2019-04-26
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多