如何从Pandas Dataframe 的Timestamp列中删除时区

mm5n2pyu  于 2022-12-09  发布在  其他
关注(0)|答案(4)|浏览(142)

我读了Pandas change timezone for forex DataFrame,但是我想使我的 Dataframe 时区的时间列与sqlite3数据库的互操作性保持原样。
我的Pandas数据框中的数据已经转换为UTC数据,但是我不想在数据库中维护这个UTC时区信息。
给定一个从其他来源派生的数据样本,它看起来像这样:

print(type(testdata))
print(testdata)
print(testdata.applymap(type))

给出:

<class 'pandas.core.frame.DataFrame'>
                        time  navd88_ft  station_id  new
0  2018-03-07 01:31:02+00:00  -0.030332          13    5
1  2018-03-07 01:21:02+00:00  -0.121653          13    5
2  2018-03-07 01:26:02+00:00  -0.072945          13    5
3  2018-03-07 01:16:02+00:00  -0.139917          13    5
4  2018-03-07 01:11:02+00:00  -0.152085          13    5
                                     time        navd88_ft     station_id  \
0  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
1  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
2  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
3  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
4  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   

             new  
0  <class 'int'>  
1  <class 'int'>  
2  <class 'int'>  
3  <class 'int'>  
4  <class 'int'>

但是,

newstamp = testdata['time'].tz_convert(None)

给出最终错误:

TypeError: index is not a valid DatetimeIndex or PeriodIndex

如何将该列替换为时区初始时间戳?

dxxyhpgq

dxxyhpgq1#

列必须是datetime dtype,例如在使用pd.to_datetime之后。然后,您可以使用tz_localize更改时区,一个简单的时间戳对应于时区None

testdata['time'].dt.tz_localize(None)

除非数据行是索引(DatetimeIndex),否则必须使用.dt存取子来存取pandas datetime functions

p4tfgftt

p4tfgftt2#

当您的数据包含跨越不同时区的日期时间,或应用夏令时前后的日期时间时,例如从psycopg2的postges数据库中获取的日期时间,根据Pandas的版本,您可能会遇到以下最佳转换方法:

testdata['time'].apply(lambda x: x.replace(tzinfo=None))

这种方法有效(注意FixedOffsetTimezone与不同offset的用法)而.dt.tz_localize(None)无效的情况:
第一个

jv2fixgn

jv2fixgn3#

我知道你提到你的时间戳已经是UTC了,但是为了防御起见,你最好让你的代码不受时间戳(部分或全部)在不同时区的影响。这样做不会花费任何代价,而且会更健壮:

newcol = testdata['time'].dt.tz_convert(None)

作为per the docs
Nonetz将转换为UTC并删除时区信息。
这比仅删除时间戳可能包含的任何时区更安全。

mmvthczy

mmvthczy4#

这里有一个函数

  • 查找包含pd.Timestamp的任何示例的所有列
  • 将这些列转换为dtype datetime(以便能够在序列上使用.dt访问器)
  • 使用dt.tz_localize(None)本地化所有时间戳,这将保持相对于UTC的时移
def remove_tz_from_dataframe(df_in):
    df = df_in.copy()
    col_times = [ col for col in df.columns if any([isinstance(x, pd.Timestamp) for x in df[col]])]
    for col in col_times:
        df[col] = pd.to_datetime(
            df[col], infer_datetime_format=True) 
        df[col] = df[col].dt.tz_localize(None) 
    return df

相关问题