我读Pandas change timezone for forex DataFrame,但我想让我的recrame timezone的time列与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条答案
按热度按时间mzsu5hc01#
列必须是
datetime
dtype,例如在使用pd.to_datetime
之后。然后,您可以使用tz_localize
来更改时区,一个朴素的时间戳对应于时区None
:字符串
除非列是索引(
DatetimeIndex
),否则必须使用.dt
访问器来访问pandas datetime functions。eagi6jfj2#
当您的数据包含跨越不同时区或应用夏令时之前和之后的日期时间时,例如使用psycopg 2从postges数据库获得的数据,根据pandas版本,您可能最终会遇到一些最佳转换方法的情况:
字符串
当这起作用时的场景(注意
FixedOffsetTimezone
与不同的offset
一起使用),而.dt.tz_localize(None)
的使用不起作用:cgvd09ve3#
我知道你提到你的时间戳已经是UTC了,但是为了防御起见,你也可以让你的代码不受时间戳(部分或全部)在不同时区的情况的影响。这不会花费任何东西,而且会更健壮:
字符串
如per the docs:
None
的tz
将转换为UTC并删除时区信息。这比删除时间戳可能包含的任何时区更安全。
rqcrx0a64#
这里有一个函数,
dt.tz_localize(None)
本地化所有时间戳,这将保持相对于UTC的时移字符串