Python 将数据帧中的日期时间保存为csv时保留时区

Python 将数据帧中的日期时间保存为csv时保留时区,python,pandas,time,pytz,Python,Pandas,Time,Pytz,我使用下面的代码将时间戳保存到磁盘,然后在以后的某个日期查找自该时间以来经过的时间。我的问题是,当我使用businesstimedelta包时,它返回一个错误,即我的数据帧没有时区。我假设它在保存到csv时丢失: import pandas as pd import time import datetime import pytz import businesstimedelta from pytz import timezone workday = businesstimedelta

我使用下面的代码将时间戳保存到磁盘,然后在以后的某个日期查找自该时间以来经过的时间。我的问题是,当我使用businesstimedelta包时,它返回一个错误,即我的数据帧没有时区。我假设它在保存到csv时丢失:

import pandas as pd
import time
import datetime
import pytz
import businesstimedelta
from pytz import timezone   


workday = businesstimedelta.WorkDayRule(start_time=datetime.time(9,30),end_time=datetime.time(16),working_days=[0, 1, 2, 3, 4])

timestamps = pd.DataFrame([datetime.datetime.now(timezone('America/New_York'))])
time.sleep(5)
timestamps.to_csv('timestamps.csv')
timestamps2 = pd.read_csv('timestamps.csv')
difference = workday.difference(timestamps2,datetime.datetime.now(timezone('America/New_York'))).hours
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
10个时间戳。到_csv('timestamps.csv'))
11 timestamps2=pd.read\u csv('production temp/positions.csv'))
--->12差异=workday.difference(timestames2,datetime.datetime.now(时区(“美国/纽约”))。小时
c:\users\g\appdata\local\programs\python38\lib\site packages\businesstimedelta\rules\rule.py(self、dt1、dt2)
29 def差异(自身、dt1、dt2):
30“计算两个datetime对象之间的业务时间”
--->31 dt1=本地化\u未本地化\u dt(dt1)
32 dt2=本地化\u未本地化\u dt(dt2)
33开始,结束=排序([dt1,dt2])
c:\users\g\appdata\local\programs\python38\lib\site packages\businesstimedelta\businesstimedelta.py在localize\u uncalized\u dt(dt)中
8.https://docs.python.org/3/library/datetime.html#datetime.timezone
9     """
--->10如果dt.tzinfo不是无且dt.tzinfo.utcoffset(dt)不是无:
11返回dt
12返回pytz.utc.localize(dt)
c:\users\g\appdata\local\programs\python38\lib\site packages\pandas\core\generic.py in\uuuuuuuu getattr\uuuuu(self,name)
5463如果自我信息轴可以保存标识符,并且保存名称(名称):
5464返回自我[姓名]
->5465返回对象。\uuuu getattribute\uuu(self,name)
5466
5467定义设置属性(self,名称:str,值)->无:
AttributeError:“DataFrame”对象没有属性“tzinfo”
我假设它在保存到csv时丢失

是的,这是问题的一部分。CSV是一种低保真度的数据格式,不能保存大多数对象的数据类型。首先,所有内容都以数字或字符串的形式读取。然后,CSV的读取器有责任确定要使用的数据类型。(熊猫自动完成了出色的检测工作。)

您在这里有几个选项:

  • 读取数据帧后,将字符串转换为正确的日期时间格式
  • 告诉Pandas读取文件时要使用的转换器
  • 导出为保留数据类型的其他文件格式,如pickle
  • 现在,一旦您读取了数据并将其加载到datetime数据类型而不是
    对象
    ,您将发现该系列具有数据类型
    熊猫。_libs.tslibs.Timestamp.Timestamp

    dt1 = datetime.datetime.now(timezone('America/New_York'))
    timestamps = pd.Series(data=[dt1])
    print(type(dt1)) # <class 'datetime.datetime'>
    print(timestamps.dtype) # datetime64[ns, America/New_York]
    print(type(timestamps.at[0])) # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
    
    0
    数据类型:对象
    
    您还应该了解Pandas对时间增量的原生支持:


    以及对工作日的各种支持:

    你能仔细看看你提供的代码片段吗?时间戳2没有使用。我编辑了它,这是我键入时的一个错误。好的,谢谢。我查看了本机的熊猫时间增量,但它似乎无法处理工作时间,或者我错过了什么?请参阅关于将您的系列转换回本机datetime的我的更新
    timestamps2["0"] = pd.to_datetime(timestamps2["0"])
    
    timestamps2 = pd.read_csv("./timestamps.csv", converters={"0": pd.to_datetime})
    
    dt1 = datetime.datetime.now(timezone('America/New_York'))
    timestamps = pd.Series(data=[dt1])
    print(type(dt1)) # <class 'datetime.datetime'>
    print(timestamps.dtype) # datetime64[ns, America/New_York]
    print(type(timestamps.at[0])) # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
    
    dt1 = datetime.datetime.now(timezone('America/New_York'))
    dt2 = dt1 + datetime.timedelta(seconds=1)
    timestamps = pd.Series([dt1])
    timestamps.apply(lambda dt: workday.difference(dt.to_pydatetime(), dt2))
    
    0    <BusinessTimeDelta 0 hours 1 seconds>
    dtype: object