使用python 3中的matplotlib从CSV读取x轴上的时间

时间:2015-02-18 23:27:54

标签: python-3.x matplotlib

我根据开普勒第三定律测量木星的质量。我拍摄了147张木星及其月球的图像,特别是木卫一。我编写了代码来从图像文件中获取位置矢量,这样我就可以计算出Io和Jupiter之间距离的大小(距离)。这将允许我绘制一段时间内的距离。即:plot(t,d)

下面的代码虽然不优雅,但实现这个奇妙。然而,我正在尝试将我的日期时间数组转换为可绘制的值。我有几个晚上的数据。该图将是正弦曲线,并且通过解释该曲线将导出Io轨道的周期。我已经包含了代码,然后是.txt格式的CSV文件:python3

import numpy as np
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates
import math

# Declare arrays (lists) for (x,y) pixel position vectors from .fits
# image files. 
jup_x = []
jup_y = []
io_x = []
io_y = []
cal_x = []
cal_y = []
gan_x = []
gan_y = []
eur_x = []
eur_y = []
date_and_time = []

readFile = open('raw_data1.txt','r')

sepFile = readFile.read().split('\n')

readFile.close()

for j_pos_pair in sepFile:
    j_xandy = j_pos_pair.split(',')
    jup_x.append(int(j_xandy[1]))
    jup_y.append(int(j_xandy[2]))

print(jup_x)
print(jup_y)

for io_pos_pair in sepFile:
    io_xandy = io_pos_pair.split(',')
    io_x.append(int(io_xandy[3]))
    io_y.append(int(io_xandy[4]))

print(io_x)
print(io_y)

for cal_pos_pair in sepFile:
    cal_xandy = cal_pos_pair.split(',')
    cal_x.append(int(cal_xandy[5]))
    cal_y.append(int(cal_xandy[6]))

print(cal_x)
print(cal_y)

for gan_pos_pair in sepFile:
    gan_xandy = gan_pos_pair.split(',')
    gan_x.append(int(gan_xandy[7]))
    gan_y.append(int(gan_xandy[8]))

print(gan_x)
print(gan_y)

for eur_pos_pair in sepFile:
    eur_xandy = eur_pos_pair.split(',')
    eur_x.append(int(eur_xandy[9]))
    eur_y.append(int(eur_xandy[10]))

print(eur_x)
print(eur_y)

for date_time in sepFile:
    d_and_t = date_time.split(',')
    date_and_time.append(str(d_and_t[0]))

print(date_and_time)

# make into arrays for vector operations
# date_and_time = np.array(date_and_time)
datetime = np.array(date_and_time)
Jup_x = np.array(jup_x)
Jup_y = np.array(jup_y)

Io_x = np.array(io_x)
Io_y = np.array(io_y)

print(Jup_x)
print(Jup_y)
print(Io_x)
print(Io_y)

# vector subtraction (Position vector between Jupiter and Io)
J_Io_s_x = Jup_x - Io_x  # reads: separation between Io and Jupiter x values
J_Io_s_y = Jup_y - Io_x  # reads: separation between Io and Jupiter y values

print(J_Io_s_x)
print(J_Io_s_y)

M_s_J_Io = ((J_Io_s_x)**2 + (J_Io_s_y)**2)**0.5 # The magnitude of the separation 
                                                # between Jupiter and Io in pixels
print(M_s_J_Io)

from datetime import datetime
datetime.strptime("2015-feb-05 19:00", "%Y-%b-%d %H:%M")

x = np.array([datetime.datetime(2015, 2, 5, i, 0) for i in range(24)])
plot_M_s_J_Io = np.array(M_s_J_Io)

plt.plot(x,plot_M_s_J_Io)
plt.show()

CSV文件:(这是测试运行副本,实际列表更大)

2015-feb-05 20:11,1150,735,1335,647,307,1123,0000,000,965,818

上面的CSV文件也包含所有卫星的信息。对于我的测试,我把它限制在Jupiter和Io的信息上。这只是CSV文件中的前五个字段。它的索引是0-10。

任何建议,我知道我很接近,我只是不了解它的时间转换方面。完全披露:这是针对NMT的LAB,但是我已经在本报告中超越了,因为我使用python而不是手动执行此操作。所有帮助当然非常感谢。

杰西

2 个答案:

答案 0 :(得分:0)

由于我没有您的文件,因此我只能假设您的数据处理工作正在进行中:

from datetime import datetime

但是从那时起,您的代码中会有一些奇怪的怪癖。

首先你的陈述datetime.strptime("2015-feb-05 19:00", "%Y-%b-%d %H:%M")什么都不做。它运行,但不会将返回值分配给变量。所以摆脱它是安全的。

其次是在行:

x = np.array([datetime.datetime(2015, 2, 5, i, 0) for i in range(24)])

此行将起作用,因为您在脚本开头导入了datetime模块。但如果你没有这样做,你就会导致出现错误信息。由于您明确导出了日期时间模块的datetime函数,因此我建议您使用它,为了简洁/清晰起见,而不是datetime.datetime

最后(也可能是唯一的实际错误)是要在pyplot中绘制时间序列,你必须使用pyplot.plot_dates函数和 pyplot.plot函数。

答案 1 :(得分:0)

这就是运行和工作的原因,感谢输入人员:

from datetime import datetime                   
t = datetime.strptime("2015-feb-05 19:00", "%Y-%b-%d %H:%M")
for line in date_and_time:
    t = datetime.strptime(line, "%Y-%b-%d %H:%M")
    plot_time.append(t.timestamp())
plt.plot(plot_time,M_s_J_Io)
plt.show()