将 unix 对象列转换为日期时间 - python

Convert column of unix objects to datetime - python

我希望将 UNIX 时间戳对象转换为 pandas 日期时间。我从一个单独的来源导入时间戳,第一个时间点显示 21-01-22 00:01 的日期时间,第二个时间点显示 21-01-22 00:15 的日期时间。然而我的转换比这两个晚了 10 个小时。这与每个字符串末尾的+1000有关吗?

df = pd.DataFrame({      
    'Time' : ['/Date(1642687260000+1000)/','/Date(1642688100000+1000)/'],
   })

df['Time'] = df['Time'].str.split('+').str[0]
df['Time'] = df['Time'].str.split('(').str[1]
df['Time'] = pd.to_datetime(df['Time'], unit = 'ms')

输出:

                 Time
0 2022-01-20 14:01:00
1 2022-01-20 14:15:00

其他来源:

                 Time
0 2022-01-21 00:01:00
1 2022-01-21 00:15:00

您可以使用正则表达式提取 Unix 时间和 UTC 偏移量,然后将 Unix 时间解析为日期时间并将 UTC 偏移量添加为时间增量,例如

import pandas as pd

df = pd.DataFrame({      
    'Time' : ['/Date(1642687260000+1000)/','/Date(1642688100000+1000)/', None],
   })

df[['unix', 'offset']] = df['Time'].str.extract(r'(\d+)([+-]\d+)')

# datetime from unix first, leaves NaT for invalid values
df['datetime'] = pd.to_datetime(df['unix'], unit='ms')
# where datetime is not NaT, add the offset:
df.loc[~df['datetime'].isnull(), 'datetime'] += (
                  pd.to_datetime(df['offset'][~df['datetime'].isnull()], format='%z').apply(lambda t: t.utcoffset())
          )

# or without the apply, but by using an underscored method:
# df['datetime'] = (pd.to_datetime(df['unix'], unit='ms') + 
#                   pd.to_datetime(df['offset'], format='%z').dt.tz._offset)

df['datetime']
# 0   2022-01-21 00:01:00
# 1   2022-01-21 00:15:00
# 2                   NaT
# Name: datetime, dtype: datetime64[ns]

不幸的是,如果您想避免 apply,则必须使用带下划线的(“私有”)方法。这也只有在你有一个恒定的偏移量时才有效,即如果它在整个系列中都是相同的偏移量。