我读了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
如何将该列替换为时区初始时间戳?
4条答案
按热度按时间dxxyhpgq1#
列必须是
datetime
dtype,例如在使用pd.to_datetime
之后。然后,您可以使用tz_localize
更改时区,一个简单的时间戳对应于时区None
:除非数据行是索引(
DatetimeIndex
),否则必须使用.dt
存取子来存取pandas datetime functions。p4tfgftt2#
当您的数据包含跨越不同时区的日期时间,或应用夏令时前后的日期时间时,例如从psycopg2的postges数据库中获取的日期时间,根据Pandas的版本,您可能会遇到以下最佳转换方法:
这种方法有效(注意
FixedOffsetTimezone
与不同offset
的用法)而.dt.tz_localize(None)
无效的情况:第一个
jv2fixgn3#
我知道你提到你的时间戳已经是UTC了,但是为了防御起见,你最好让你的代码不受时间戳(部分或全部)在不同时区的影响。这样做不会花费任何代价,而且会更健壮:
作为per the docs:
None
的tz
将转换为UTC并删除时区信息。这比仅删除时间戳可能包含的任何时区更安全。
mmvthczy4#
这里有一个函数
dt.tz_localize(None)
本地化所有时间戳,这将保持相对于UTC的时移