将带有时间戳字符串的Pandas DF转换为不带tz的本地日期时间

时间:2019-07-12 09:54:53

标签: python python-3.x pandas timestamp localtime

我有带字符串时间戳记的DataFrame列,我想将其转换为不带时区的本地日期时间。

df = {'id' : [1, 2, 3],
      'timestamp' : ['2019-07-01T21:30:20Z', '2019-07-02T21:30:20Z', '2019-07-03T21:30:20Z']}
df = pd.DataFrame(df, columns = ['id','timestamp'])

我的代码:

df['timestamp'] = (pd.DatetimeIndex(pd.to_datetime(df['timestamp'], format="%Y-%m-%dT%H:%M:%SZ",
  errors='ignore')).tz_localize('UTC').tz_convert('Europe/Prague'))

这在上面的示例中有效,但在下面的示例中无效。 OutOfBoundsDatetime:超出范围的纳秒级时间戳记

df = {'id' : [1, 2, 3],
      'timestamp' : ['2019-07-01T21:30:20Z', '2999-12-31T21:30:20Z', '9999-12-30T21:30:20Z']}

2999-12-31T21:30:20Z或9999-12-30T21:30:20Z有问题。我该怎么解决?

1 个答案:

答案 0 :(得分:0)

因此,熊猫可以容纳的最大时间戳为'2262-04-11 23:47:16.854775807'(请参见https://pandas-docs.github.io/pandas-docs-travis/user_guide/timeseries.html#timestamp-limitations)。因此,第二个和第三个时间戳都是问题。

至于解决方法,如果您需要这些日期,我不确定是否可以帮助您。但是,您可以通过更改errors参数来删除它们。

我还摆脱了您调用的某些函数,因为它们不需要在那里。

df = pd.DataFrame({'id' : [1, 2, 3], 
                   'timestamp' : ['2019-07-01T21:30:20Z', 
                                  '2999-12-31T21:30:20Z', 
                                  '9999-12-30T21:30:20Z']})

df['timestamp'] = pd.to_datetime(df['timestamp'], 
                                 format="%Y-%m-%dT%H:%M:%SZ", errors='coerce', utc=True)

df['timestamp'] = df['timestamp'].dt.tz_convert('Europe/Prague')

df.dropna(),如果您需要删除NaT