将 yfinance Timestamp 中的日期写入 influxdb 并查询日期 - 时区支持

gra*_*ed8 0 influxdb influxdb-python

我正在尝试将日期/时间数据写入 influxdb 并将数据查询到数据帧。

当我写数据日期时间时看起来像这样......

ticker= 'AAPL'
import yfinance as yf
df = yf.Ticker('AAPL').history(period="1d").index[0]
print(df)

output:
Timestamp('2023-01-05 00:00:00-0500', tz='America/New_York')
Run Code Online (Sandbox Code Playgroud)

...当我将数据查询到数据帧并打印它时,我得到:

df['_time']

output:
0   2023-01-05 05:00:00+00:00
Name: _time, dtype: datetime64[ns, tzutc()]
Run Code Online (Sandbox Code Playgroud)

我需要做什么才能在 influxdb 中正确写入时间?

请参阅下面的完整代码:

########## WRITE ##########

    import yfinance as yf
    import influxdb_client
    from influxdb_client.client.write_api import SYNCHRONOUS, PointSettings


    token = "my-token"
    org = "my-org"
    url = "my-url"
    bucket = "stocks_us"
    retention_policy = "autogen"
    
    client = influxdb_client.InfluxDBClient(url=url, token=token, org=org)
    write_api = client.write_api(write_options=SYNCHRONOUS)

   df = yf.Ticker('AAPL').history(period="1d")

   with client:
    """
    Ingest DataFrame with default tags
    """
    point_settings = PointSettings(**{"ticker": ticker})
    
    write_api = client.write_api(write_options=SYNCHRONOUS, 
                                 point_settings=point_settings)
    write_api.write(bucket=bucket, 
                    org= "dev", 
                    record=df, 
                    data_frame_measurement_name="stock_daily_df")

    client.close()

    print(df)
Run Code Online (Sandbox Code Playgroud)

########## QUERY ##########

import influxdb_client 

token = "my-token"
org = "my-org"
url = "my-url"
bucket = "stocks_us"
retention_policy = "autogen"

client = influxdb_client.InfluxDBClient(url=url, token=token, org=org)

query_api = client.query_api()
measurement= "stock_daily_df"

with client:
    
    """
    Querying ingested data
    """
    query = 'from(bucket:"{}")' \
            ' |> range(start: 0, stop: now())' \
            ' |> filter(fn: (r) => r._measurement == "{}")' \
            ' |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")' \
            ' |> filter(fn: (r) => r["ticker"] == "AAPL")'\
            ' |> limit(n:10, offset: 0)'.format(bucket, measurement)
            
    df = query_api.query_data_frame(query=query)

    print(df)
Run Code Online (Sandbox Code Playgroud)

小智 5

Flux 将在UTC中完成所有工作,这是一个简单的线性时钟,并将其留给用户来计算显示。因此,为了保持时间戳一致,我们应该在插入数据之前将时间戳转换为UTC,并在查询完成后将数据结果转换回相应的时间戳。

1.在yfinance库中将时间戳转换为UTC:

dt.replace(tzinfo=timezone.utc)
Run Code Online (Sandbox Code Playgroud)

2.将 UTC 时间戳转换为本地时间戳:

import "timezone"

option location = timezone.location(name: "America/New_York")
Run Code Online (Sandbox Code Playgroud)

请在此处查看更多详细信息。